Azure Function Bus Trigger 在收到来自 Azure Service Bus Queue 的消息后重复触发

问题描述 投票:0回答:1

我有一个将服务总线消息发送到我的 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 行为”的信息,根据文档中的内容,该行为会在函数运行时自动刷新消息锁 - 来源 那将是完美的,但我不知道为什么它不起作用。我应该以某种方式设置它吗?

我的期望:

  • Azure 服务总线队列消息不会被处理多次,至少只要第一个(前一个)触发器在工作。
  • 另一种适合长时间处理的解决方案。

我的环境: .NET 6; Azure 函数版本。 4.2.1; Azure Function Premium Plan(值得注意,因为在消费计划中不能运行超过10分钟)

.net azure azure-functions azureservicebus
1个回答
0
投票

可以设置

maxAutoRenewDuration
小于azure service bus队列中设置的
maxLockDuration
,同时保持
maxConcurrentCalls
不变
1
,那么你应该只消费一次消息,它会自动更新锁。我认为
maxAutoRenewDuration
存在混淆,它似乎以相反的方式工作,而不是相反的方式。

© www.soinside.com 2019 - 2024. All rights reserved.