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



我有一个函数应用程序,可以监视swappa.com并发送SMS,如果有与我的标准匹配的电话列表。计时器触发功能每15分钟检查Swappa,而队列触发功能为每个匹配列表发送一条短信。我专门使用绑定来访问存储和twilio来保持额外的"功能"。

保持状态并避免发送有关同一列表的重复文本消息的最佳功能模式是什么?即使我可以检查列表的年龄,也可以在较旧的列表中降低价格,从而使其成为新的比赛。因此,我需要跟踪已经处理过的单个列表。

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

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

我不确定您要列出多少列表。但是,由于您能够每15分钟爬一次一次,因此我认为我的情况是可行的。否则,使用答案中所述的基于队列的方案。

这是我到目前为止提出的两个解决方案。

  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);
        }
    };

下调:如果该功能被禁用了一段时间,然后启用后来启用,则可能会同时检查表存储,并将同一列表的两个实例传递到第二个Queue。

  1. 使用BLOB触发器作为SMS功能而不是队列触发器。使用斑点名称消除重复。如果仅使用绑定,则可能需要在两者之间添加单独的队列触发功能以检查现有斑点,并将队列项目变成新的斑点。

Downsides

  • BLOB输出绑定将更新现有的斑点,因此仍然有机会并行执行中间函数触发两个文本消息。
  • 根据https://lealen.microsoft.com/en-us/azure/azure-functions/functions-bindings-bindings-storage-blob。

最新更新