消息泵(OnMessage)导致MaxDeliveryCountExceeded?

时间:2017-02-02 20:42:02

标签: azure azureservicebus

我已根据建议在Azure辅助角色中实现了消息泵模式。它当前配置为AutoComplete = True和MaxConcurrentCalls = 1。

在执行负载测试时,我注意到只要我有足够的VM实例准备好并等待,消息就会得到很好的处理。一旦我尝试通过太少的VM实例推送太多消息,就会有大部分(超过40%)消息被快速发送到DLQ,原因是MaxDeliveryCountExceeded。

这违背了我的期望 - 我希望消息能够在队列中备份,VM实例会慢慢地通过它们进行咀嚼,但最终还是会处理它们。实际上,这就是我选择消息队列模式的原因。

我怀疑Message Pump是原因。感觉就像幕后一样,它试图快速和激烈地传递这些消息,而虚拟机也无法跟上,但与此同时,交付计数器正在增加,因此在几秒钟内就会发生10次尝试并结束在DLQ中。

任何人都有类似的工作经验或指导吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

有几点需要注意:

  1. 您的处理时间超过队列(或订阅)上定义的LockDuration期限。请记住,较低层的VM也具有较低的IOPS,这可能会影响事物。结合相对较低的MaxDeliveryCount(默认为10),它将是DLQ消息。
  2. 您已启用PrefetchCount,而是收到一条消息,您就会获得批量。您的处理只能通过某些消息进行处理,因此批量锁的其余部分将丢失,并且会重新传递消息。默认情况下,此预取设置为零(禁用),但在您的情况下可以使用它。
  3. 无论哪种方式,DeliveryCount都会增加,从而导致您的消息最终成为DLQ。