Azure 服务总线中的消息锁定和锁定续订如何工作?

Ala*_*lan 5 azure azureservicebus azure-servicebus-queues azure-functions

试图确定窥视锁在服务总线中的工作方式时,我有点困惑。特别是我将 Microsoft.Azure.ServiceBus 与 Azure Functions 和 ServiceBusTrigger 一起使用。

从我可以看出消息被锁定的时间是在队列本身上设置的,默认为 30 秒,尽管它可以设置为最多 5 分钟的任何时间。

当从队列中偷看一条消息时,这个锁就会启动。

然后有一个名为 maxAutoRenewDuration 的设置,当使用 Azure Functions 时,该设置在 Extensions:ServiceBus:messageHandlerOptions 下的 host.json 文件中设置。这允许客户端自动请求一个或多个对锁的扩展,直到达到 maxAutoRenewDuration。一旦达到此限制,将不会请求续订,并且锁定将被释放。

续订是尽最大努力并且不能保证,因此理想情况下,您尝试提出一种设计,其中消息通常在队列上指定的锁定期内处理。

到目前为止我做对了吗?

我还有的问题是

  1. 是否存在 maxAutoRenewDuration 可以设置的限制。我读过的一篇文章似乎表明,这可以设置为我需要的任何内容,以确保我的消息得到处理(链接)。Microsoft 文档虽然声明此最大值也限制为 5 分钟(链接)。

maxAutoRenewDuration 可在 host.json 中配置,它映射到 OnMessageOptions.MaxAutoRenewDuration。根据服务总线文档,此设置允许的最大值为 5 分钟

哪个是正确的?我知道默认锁定持续时间最长为 5 分钟,但这似乎也适用于 maxAutoRenewDuration 似乎没有意义?

  1. 我在一些文章(例如链接)中读到了一个叫做 MaxLockDuration 的设置。这只是指队列本身设置的锁定持续时间吗?

  2. 我还缺什么吗?队列中设置的锁定持续时间和代码中的 maxAutoRenewDuration 是我在处理锁定和续订时需要考虑的主要事项吗?

谢谢

艾伦

kri*_*shg 3

我理解你的困惑。官方文档的解释maxAutoRenewDuration似乎是错误的。已经有一个开放文档问题https://github.com/MicrosoftDocs/azure-docs/issues/62110以及一个参考https://github.com/Azure/azure-functions-host/issues/6500

明确您的问题:

  • #1:如上所述,存在开放文档问题。
  • #2:MaxLockDuration 是服务总线队列端设置,它基本上表示如果您从队列中查看锁定消息,则该消息将在该持续时间内为使用者锁定。因此,除非您在该期限内完成消息处理或更新锁定,否则锁定将过期。
  • #3:@sean-feldman 在线程/sf/answers/4226673251/中的精彩解释应该回答这个问题。

它的作用是延长与代理的消息租约,为当前正在处理消息的竞争消费者“重新锁定”它。MaxAutoRenewDuration 应设置为“租约可能需要的最大处理时间”。