Azure 队列触发器 - 在不工作时执行一条消息

use*_*400 6 azure azure-queues azure-functions

我有一个与队列关联的 azure 队列触发器,我想确保触发器一次只读取和执行一条消息。因此,当消息被执行(成功与否)时,它会处理下一条消息。

正在发生的事情是队列执行一条消息,但它开始执行另一条消息。我的主机.json:

"queues": {
    "maxPollingInterval": 20000,
    "visibilityTimeout": "00:01:00",
    "batchSize": 1,
    "maxDequeueCount": 5,
    "newBatchThreshold": 1
  }
Run Code Online (Sandbox Code Playgroud)

以下来自 MS 链接的说明:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#trigger---configuration

如果要避免在一个队列上接收的消息并行执行,可以将 batchSize 设置为 1

所以预计一次只运行一条消息(我正在使用消费计划)。

这很关键,因为我需要确保它当时只处理一条消息。

有什么设置可以更改吗?

或者队列触发器不是解决这个需求的好选择?

Kar*_*SFT 5

如果要最大程度地减少函数应用中队列触发函数的并行执行,可以将批处理大小设置为 1。但只有当函数应用在单个虚拟机 (VM) 上运行时,此设置才能消除并发性。

如果每个虚拟机上有多个虚拟机和函数实例,则将为每个虚拟机中运行的每个函数实例处理一条消息。

这篇微软文档解释了触发器的并发性。


Eag*_*Dev 4

存储队列不保证顺序- 因此,如果由于交付顺序很重要而需要顺序处理,则需要考虑 Azure 服务总线并在功能设置 (host.json) 中进行设置

maxConcurrentCalls = 1
Run Code Online (Sandbox Code Playgroud)

即使您通过设置函数应用程序可以缩放到的最大实例数来实现这一点,Azure 存储队列仍然无法保证排序。

WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1
Run Code Online (Sandbox Code Playgroud)

Microsoft 文档并不是完美的。它正在不断更新。