Azure ServiceBus AutoRenewTimeout

我通过.net SDK使用Azure ServiceBus队列。 OnMessageHandler / OnMessageOptions上有一个名为“AutoRenewTimeout”的标志,但似乎对这个值的实际含义感到困惑。

在这里的官方文档https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.aspx它建议AutoRenewTimeout应该大于队列锁定。

获取或设置自动续订锁定的最长持续时间。 该值应大于最长的消息锁定持续时间; 例如,LockDuration属性。

这似乎表明AutoRenewTimeout或多或少是处理消息所需的最长时间。 例如,如果您的锁定持续时间为1分钟,并且自动续订时间为5分钟,则该消息将在放弃之前总共续订5次,并再次在队列中显示。 还有其他StackOverflow答案确认这种情况,例如https://stackoverflow.com/a/36051408

要处理长消息处理,您应该设置AutoRenewTimeout == 10分钟(在您的情况下)。 这意味着每次LockDuration过期时,锁定将在这10分钟内更新。

因此,例如,如果您的LockDuration为3分钟且AutoRenewTimeout为10分钟,则每3分钟锁定将自动续订(3分钟,6分钟和9分钟后),并且自消息消耗后12分钟后锁定将自动释放。

然而,在更多的研究中,我偶然发现了一条旧的推文( https://twitter.com/clemensv/status/649940087267041284 ),它看起来像是微软消息传递的首席架构师。 在这条推文中,它似乎表明AutoRenewTimeout是调用“RenewLock”方法的时间间隔。

它是在回调处于活动状态时在消息上调用https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.renewlock.aspx的时间间隔

因此,例如,如果您的锁定时间是1分钟,则AutoRenewTimeout应该是30秒,以确保在释放之前更新消息锁定。

在我自己的测试中,我倾向于前者是正确的,但推文让我怀疑的事实可能我不知道充分利用AutoRenewTimeout

你的测试是正确的。

AutoRenewTimeout将允许延长LockDuration之外的处理时间,而LockDuration增加DeliveryCount 。 它应该设置为最大处理时间回调。 将其作为时间范围读取,等待处理回调完成。 在那之后,OnMessage API将不会发布续订。