我有一个与队列关联的azure队列触发器,我想确保触发器当时只读取并执行一条消息。因此,当消息执行(成功或不成功)时,它会处理下一条消息。
发生的事情是队列执行一条消息,但它开始执行其他消息。我的host.json:
"queues": {
"maxPollingInterval": 20000,
"visibilityTimeout": "00:01:00",
"batchSize": 1,
"maxDequeueCount": 5,
"newBatchThreshold": 1
}
遵循MS链接的说明:
“如果要避免在一个队列上收到的邮件并行执行,可以将batchSize设置为1”
因此,预计当时只会运行一条消息(我正在使用消费计划)。
这很关键,因为我需要确保当时只处理一条消息。
我可以更改任何设置吗?
或者队列触发器不是解决此要求的好选择吗?
谢谢!
答案 0 :(得分:3)
存储队列不保证订购 - 因此,如果需要顺序处理,因为交付顺序很重要,您需要考虑Azure Service Bus并在功能设置(host.json)中设置
maxConcurrentCalls = 1
即使您通过设置功能应用可以扩展到的最大实例数来执行此操作,仍然无法保证Azure存储队列的排序。
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1
Microsoft文档并不完美。它不断更新。
答案 1 :(得分:1)
如果要在函数应用程序中最小化队列触发函数的并行执行,可以将批处理大小设置为1. 但是只要您的函数应用程序在上运行,此设置就会消除并发性单个虚拟机(VM)。
如果每个VM上有多个虚拟机和功能实例,则会为每个虚拟机中运行的每个功能实例处理一条消息。
This microsoft文档解释了触发器的并发性。
答案 2 :(得分:0)
对于遇到此问题的人希望在本地进行调试并遇到多个队列项的问题使这变得困难,您可以将以下内容添加到您的 local.settings.json
以覆盖仅在您的机器上的默认功能强>:
{
"IsEncrypted": false,
"Values": {
"AzureFunctionsJobHost__extensions__queues__batchSize": 1
}
}