消除Azure功能工作流程中的重复项目?

时间:2017-09-17 04:55:40

标签: azure binding duplicates azure-functions

我有一个功能应用程序监视swappa.com并发送短信,如果有符合我标准的手机列表。定时器触发器功能每15分钟检查一次swappa,队列触发器功能为每个匹配的列表发送一条文本消息。我使用绑定专门访问存储和twilio以保持额外的功能"功能性"。

维护状态的最佳功能模式是什么,避免发送有关相同列表的重复短信?即使我可以检查列表的年龄,也可以降低旧列表的价格,使其成为新的匹配。因此,我需要跟踪已处理的各个商家信息。

2 个答案:

答案 0 :(得分:1)

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

您还应该能够从此状态中删除旧项目,以避免它随着时间的推移而爆炸。

我不确定你会有多少个房源。但由于你能够每15分钟抓取所有这些,我认为我的方案是可行的。否则,请使用答案中描述的基于队列的方案。

答案 1 :(得分:0)

到目前为止,我已经提出了两个解决方案。

  1. 在中间添加队列触发器功能以检查表存储。如果表中没有条目,请将该项添加到表和第二个队列中。
  2. 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名称来消除重复项。如果仅使用绑定,则可能需要在中间添加单独的队列触发器函数以检查现有blob,并将队列项转换为新blob。
    2. <强>缺点