自动自动更新Azure Service Bus上的锁定

Jim*_*Aho 2 azure azureservicebus

因此,我试图了解服务总线的时间安排...特别是锁如何工作。我们可以选择手动调用CompleteAsync。处理也可能需要一些时间。在这些情况下,我们要确保我们不会不必要MessageLockLostException

似乎有几个数字与之相关:

  • 锁定持续时间(在总线上的天蓝色门户中找到,当前设置为1分钟,这是默认设置)
  • AutoRenewTimeout(OnMessageOptions的属性,当前设置为1分钟)
  • 自动完成(OnMessageOptions的属性,当前设置为false)

假设处理运行了大约2分钟,然后成功或失败(暂时不影响哪种情况)。假设这是正常情况,因此这意味着处理每条消息大约需要2分钟。

此外,这确实是一个队列,而不是主题。而我们只有一个消费者认为asynchronoulsy流程与信息MaxConcurrentCalls设置为100。我们正在使用的OnMessageAsyncReceiveMode.PeekLock

现在,我的设置应该是一个单一的使用者,以可靠地处理所有消息?

我认为将Lock的持续时间设置为1分钟就可以了,因为这是默认设置,为了安全起见,我将AutoRenewTimeout设置为5分钟,因为据我所知,该值应该是处理消息所需的最长时间(根据此答案至少)。性能对于这个系统不是很关键,所以我很共鸣,因为只要我们没有收到LockedException,就可以将消息锁定一些不必要的1分钟,2分钟或3分钟并不是一件坏事,因为这些没有任何实际价值。

该线程该线程提供了如何手动更新锁的绝佳示例,但我认为有一种自动更新锁的方法。

Sea*_*man 5

现在,我的设置应该是一个单一的使用者,以可靠地处理所有消息?

除此之外LockDurationMaxConcurrentCallsAutoRenewTimeout,和AutoComplete有你可能想看看在Azure服务总线客户端的一些配置。例如,不要创建单个客户端并将其MaxConcurrentCalls设置为100,而是创建几个客户端,这些客户端的总并发级别分布在各个客户端之间。请注意,您希望使用不同的 MessagingFactory实例来创建那些客户端,以确保您拥有多个接收消息的“管道”。即使这样,最好还是要向外扩展并拥有竞争的消费者,而不是让一个消费者来处理所有负载。

现在回到设置。如果您的正常处理时间是2分钟,则最好MaxLockDuration将实体设置为此时间,而不是1分钟。这将删除对代理的不必要的锁扩展调用,并消除MessageLockLostException

另外,请记住,这AutoRenewTimeout是基于客户端的操作,不是代理,因此不能保证。您会遇到即使AutoRenewTimeout时间尚未过去,锁也会丢失的情况。

AutoRenewTimeout应始终将其设置为比MaxLockDuration使它们相等会适得其反。大于它MaxLockDuration是因为这是客户的“保险”,当处理花费的时间超过时MaxLockDuration,消息锁不会丢失。从本质上讲,使这两个相等就可以禁用此回退。