【问题标题】:Disabling Azure Function multiple simultaneous triggers禁用 Azure Function 多个同时触发器
【发布时间】:2017-06-21 10:12:09
【问题描述】:

我有一个 Azure Function App,其中包含 7 个用 Node.js 编写的函数,通过 Bitbucket CI 和项目根目录下的以下 host.json-file 进行部署:

{
    "id": "...",
    "queues": {
        // retrieve only 1 queue message at a time
        "batchSize": 1,
        "maxDequeueCount": 1,
        "newBatchThreshold": 0
    }
}

据我所知,这应该确保一次只触发 1 个队列触发函数。

但是,如果我在函数中加入以下语句:

context.log(`Started processing at ${new Date()}`);

我仍然有一些案例,2 个队列消息的开始时间完全相同。

知道我错过了什么吗? 这个batchSize 属性是每个函数还是每个队列使用?

【问题讨论】:

    标签: node.js azure azure-storage azure-functions azure-storage-queues


    【解决方案1】:

    如果您查看host.json documentation,您可以看到 batchSize 是每个(作业)函数。

    这是 Azure Functions 提取批处理的位置,queue listener

    每个 QueueTrigger 绑定都会创建一个单独的队列侦听器,因此 batchSize 是每个函数的。在这种情况下,由于您有 7 个函数从同一个队列触发,因此您可以在此实例上在不同的函数执行中同时处理多达 7 个队列消息。

    我通过编写一个 webjobs 控制台应用程序进行了验证,该应用程序具有从同一队列触发的两个功能。我可以看到有两个单独的 QueueListener 对象(通过GetHashCode),每个函数一个,同时监听同一个队列。

    为什么要禁用同时执行?

    【讨论】:

    • 明确地说,我有 7 个函数,其中 3 个函数有一个队列触发器,但它们都有一个单独的队列可以使用。所以你可以说我有 1 个函数与 1 个特定队列一起工作,并且仍然一次将多条消息出列。我实际上正在编写一个网络爬虫,所以我需要按顺序执行我的函数,直到我的队列中没有任何内容。理想的方法是将计时器触发器与我的队列消息相结合,并且每 X 秒触发一次我的函数,但是使用队列触发器一次 1 个就足够了,如果它可以像我期望的那样工作的话。感谢回复
    • 另外,我尝试在调用context.done() 之前将setTimeout() 添加到我的函数末尾以尝试将我的函数限制为10 秒,但这无济于事,一条新消息在我之前出队超时。
    • Matt 所做的所有 cmets 都是对这些配置旋钮如何影响单个主机实例上的处理的正确描述。但是,如果您的 Function App 正在横向扩展(因为它会在消耗计划中自动运行),那么您将获得跨不同 VM 实例的并发性。这些旋钮不是全局的。你在消费吗?
    • @Schaemelhout 是的,因为您可以保证并发实例的数量(在这种情况下,您只想要一个)。如果应用负载足够,消费将添加实例。
    • 部署单元是一个函数应用程序——这意味着如果函数应用程序中的任何函数需要扩展,您将获得一个包含该应用程序中所有函数的新实例。此外,缩放取决于队列长度等因素 - 如果您将 batchSizemaxDequeueCount 设置为 1,但您的队列长度很长,我们的缩放控制器将添加新实例以尝试处理负载。
    猜你喜欢
    • 2021-12-22
    • 2021-01-17
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2018-05-16
    • 2022-11-11
    相关资源
    最近更新 更多