Jim*_*Aho 2 azure azureservicebus
因此,我试图了解服务总线的时间安排...特别是锁如何工作。我们可以选择手动调用CompleteAsync。处理也可能需要一些时间。在这些情况下,我们要确保我们不会不必要MessageLockLostException。
似乎有几个数字与之相关:
假设处理运行了大约2分钟,然后成功或失败(暂时不影响哪种情况)。假设这是正常情况,因此这意味着处理每条消息大约需要2分钟。
此外,这确实是一个队列,而不是主题。而我们只有一个消费者认为asynchronoulsy流程与信息MaxConcurrentCalls设置为100。我们正在使用的OnMessageAsync有ReceiveMode.PeekLock。
现在,我的设置应该是一个单一的使用者,以可靠地处理所有消息?
我认为将Lock的持续时间设置为1分钟就可以了,因为这是默认设置,为了安全起见,我将AutoRenewTimeout设置为5分钟,因为据我所知,该值应该是处理消息所需的最长时间(根据此答案至少)。性能对于这个系统不是很关键,所以我很共鸣,因为只要我们没有收到LockedException,就可以将消息锁定一些不必要的1分钟,2分钟或3分钟并不是一件坏事,因为这些没有任何实际价值。
现在,我的设置应该是一个单一的使用者,以可靠地处理所有消息?
除此之外LockDuration,MaxConcurrentCalls,AutoRenewTimeout,和AutoComplete有你可能想看看在Azure服务总线客户端的一些配置。例如,不要创建单个客户端并将其MaxConcurrentCalls设置为100,而是创建几个客户端,这些客户端的总并发级别分布在各个客户端之间。请注意,您希望使用不同的 MessagingFactory实例来创建那些客户端,以确保您拥有多个接收消息的“管道”。即使这样,最好还是要向外扩展并拥有竞争的消费者,而不是让一个消费者来处理所有负载。
现在回到设置。如果您的正常处理时间是2分钟,则最好MaxLockDuration将实体设置为此时间,而不是1分钟。这将删除对代理的不必要的锁扩展调用,并消除MessageLockLostException。
另外,请记住,这AutoRenewTimeout是基于客户端的操作,不是代理,因此不能保证。您会遇到即使AutoRenewTimeout时间尚未过去,锁也会丢失的情况。
AutoRenewTimeout应始终将其设置为比MaxLockDuration使它们相等会适得其反。大于它MaxLockDuration是因为这是客户的“保险”,当处理花费的时间超过时MaxLockDuration,消息锁不会丢失。从本质上讲,使这两个相等就可以禁用此回退。
| 归档时间: |
|
| 查看次数: |
2355 次 |
| 最近记录: |