消息泵 (OnMessage) 导致 MaxDeliveryCountExceeded?
Message Pump (OnMessage) Causing MaxDeliveryCountExceeded?
我已经根据建议在 Azure 辅助角色中实现了消息泵模式。当前配置为 AutoComplete = True 和 MaxConcurrentCalls = 1。
在执行负载测试时,我注意到只要我有足够的 VM 实例准备好等待,消息就会得到很好的处理。一旦我尝试通过太少的 VM 实例推送太多消息,很大一部分(超过 40%)的消息会迅速发送到 DLQ,原因是 MaxDeliveryCountExceeded。
这违背了我的预期 - 我希望消息在队列中备份并且 VM 实例慢慢地咀嚼它们,但最终仍会处理它们。事实上,这就是我选择消息队列模式的原因。
我怀疑消息泵是原因。感觉就像在幕后,它正试图如此快速和激烈地传递这些消息,而 VM 只是跟不上,但与此同时,传递计数器正在增加,所以在几秒钟内发生了 10 次尝试,它们最终在DLQ.
有人有类似的经验或指导来完成这项工作吗?
提前致谢。
有两点需要注意:
- 您的处理时间比队列(或订阅)上定义的
LockDuration
时间长。请记住,较低层的 VM 的 IOPS 也较低,这可能会影响事情。结合相对较低的 MaxDeliveryCount
(默认情况下为 10),它会产生 DLQ 消息。
- 您已启用
PrefetchCount
,而不是收到一条消息,而是收到一批消息。您的处理仅通过一些消息,因此批处理锁定的其余部分丢失并且消息获得 re-delivered。默认情况下,此预取设置为零(禁用),但在您的情况下可能会使用它。
无论哪种方式,DeliveryCount
都会增加,导致您的消息最终被 DLQ。
我已经根据建议在 Azure 辅助角色中实现了消息泵模式。当前配置为 AutoComplete = True 和 MaxConcurrentCalls = 1。
在执行负载测试时,我注意到只要我有足够的 VM 实例准备好等待,消息就会得到很好的处理。一旦我尝试通过太少的 VM 实例推送太多消息,很大一部分(超过 40%)的消息会迅速发送到 DLQ,原因是 MaxDeliveryCountExceeded。
这违背了我的预期 - 我希望消息在队列中备份并且 VM 实例慢慢地咀嚼它们,但最终仍会处理它们。事实上,这就是我选择消息队列模式的原因。
我怀疑消息泵是原因。感觉就像在幕后,它正试图如此快速和激烈地传递这些消息,而 VM 只是跟不上,但与此同时,传递计数器正在增加,所以在几秒钟内发生了 10 次尝试,它们最终在DLQ.
有人有类似的经验或指导来完成这项工作吗?
提前致谢。
有两点需要注意:
- 您的处理时间比队列(或订阅)上定义的
LockDuration
时间长。请记住,较低层的 VM 的 IOPS 也较低,这可能会影响事情。结合相对较低的MaxDeliveryCount
(默认情况下为 10),它会产生 DLQ 消息。 - 您已启用
PrefetchCount
,而不是收到一条消息,而是收到一批消息。您的处理仅通过一些消息,因此批处理锁定的其余部分丢失并且消息获得 re-delivered。默认情况下,此预取设置为零(禁用),但在您的情况下可能会使用它。
无论哪种方式,DeliveryCount
都会增加,导致您的消息最终被 DLQ。