我有一个将服务总线消息发送到我的 Azure 服务总线队列的应用程序服务 - 这工作正常。 然后,我的 Azure 函数(总线触发器)从 Azure 服务总线队列接收消息。问题是大约 10 分钟后,当第一个(前一个)触发器尚未完成其工作时,Azure Function 再次从总线队列接收消息。这对我来说是个问题,因为执行逻辑最多可能需要 45 分钟。
我已经阅读了很多,但还没有找到解决方案。 首先,我尝试使用 host.json 文件中的设置来解决这个问题,代码:
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"autoComplete": true,
"maxConcurrentCalls": 1,
"maxAutoRenewDuration": "23:59:00"
}
}
},
"functionTimeout": "23:59:00"
我读到我应该将 maxAutoRenewDuration 参数设置得大一点,因为它负责更新消息锁。此外,functionTimeout 参数应超过活动的最长持续时间。使用这些选项,Azure Functions 每 10-12 分钟收到一次相同的消息。没有这些参数,它等于 5 分钟。有一些进步,但还不够。
其次,我阅读了有关“PeekLock 行为”的信息,根据文档中的内容,该行为会在函数运行时自动刷新消息锁 - 来源 那将是完美的,但我不知道为什么它不起作用。我应该以某种方式设置它吗?
我的期望:
我的环境: .NET 6; Azure 函数版本。 4.2.1; Azure Function Premium Plan(值得注意,因为在消费计划中不能运行超过10分钟)
可以设置
maxAutoRenewDuration
小于azure service bus队列中设置的maxLockDuration
,同时保持maxConcurrentCalls
不变1
,那么你应该只消费一次消息,它会自动更新锁。我认为 maxAutoRenewDuration
存在混淆,它似乎以相反的方式工作,而不是相反的方式。