2017-09-17 67 views
0

我有一个监控swappa.com的功能应用程序,如果有符合我的标准的电话列表,就会发送短信。定时器触发函数每15分钟检查一次swappa,队列触发器函数为每个匹配列表发送一条文本消息。我仅使用绑定来访问存储和twilio以保持事物额外的“功能”。消除Azure功能工作流程中的重复项目?

维护状态并避免发送关于相同列表的重复文本消息的最佳功能模式是什么?即使我可以检查列表的年龄,价格可以降低旧的上市,使他们一个新的比赛。所以我需要跟踪已处理的单独列表。

回答

0

以下是我到目前为止提出的两种解决方案。

  1. 在中间添加队列触发器功能来检查表格存储。如果表格中没有条目,则将该条目添加到表格和第二个队列中。

function.json

{ 
     "disabled": false, 
     "bindings": [ 
      { 
       "name": "queueItem", 
       "type": "queueTrigger", 
       "direction": "in", 
       "queueName": "itemqueue", 
       "connection": "AzureWebJobsStorage" 
      }, 
      { 
       "name": "itemsFoundIn", 
       "type": "table", 
       "tableName": "itemsFound", 
       "partitionKey": "{productId}", 
       "rowKey": "{price}", 
       "direction": "in", 
       "connection": "AzureWebJobsStorage" 
      }, 
      { 
       "name": "itemsFoundOut", 
       "type": "table", 
       "tableName": "itemsFound", 
       "partitionKey": "{productId}", 
       "rowKey": "{price}", 
       "direction": "out", 
       "connection": "AzureWebJobsStorage" 
      }, 
      { 
       "type": "queue", 
       "direction": "out", 
       "name": "$return", 
       "queueName": "smsqueue", 
       "connection": "AzureWebJobsStorage" 
      } 
     ] 
    } 

index.js

module.exports = function (context, queueItem) { 
     if (context.bindings.itemsFoundIn) { 
      context.log("queueItem already present in table storage. Treating as duplicate."); 
      context.done(); 
     } 
     else { 
      context.log("queueItem not found in table storage. Placing in table and destination queue."); 
      context.bindings.itemsFoundOut = queueItem; 

      context.done(null, queueItem); 
     } 
    }; 

下行:如果此功能将停用一段时间,后来启用的,有可能是检查表并行执行存储,并将同一列表的两个实例传递到第二个队列。

  1. 对sms函数使用blob触发器而不是队列触发器。使用blob名称来消除重复。如果仅使用绑定,则可能需要在中间添加单独的队列触发器函数以检查现有的斑点,并将队列项目变为新的斑点。

缺点

+1

在场景1中,您可以将消息的TTL设置为<15分钟,因此如果您的功能被禁用,则来自上一次运行的消息将被丢弃。 – Mikhail

+0

@Mikhail好点!看起来我可以使用C#和与我的输出绑定关联的'CloudQueue'参数排队多条消息并为它们指定一个TTL。 –

1

如果您担心重复,最直接的方法是将列表的所有ID(或散列)保留在一个状态(例如,在单个表存储行中)。在定时器触发器中加载此状态,根据该状态过滤出解析结果,然后更新状态并发送SMS的队列项。

你也应该能够从这个状态中删除旧的项目,以避免它随着时间的推移爆炸。

我不确定您将拥有多少物品。但既然你能够每隔15分钟抓取所有这些,我认为我的方案是可行的。否则,请按照您的答案中所述使用基于队列的方案。

+0

忽略删除旧项目,这是简单的JavaScript和一对blob绑定(一进一出)。我最初必须上传一个空的“{}”json blob。 –