我们观察了RabbitMQ的以下行为,并试图了解它是否正确以及如何解决它 .
场景:
-
(持久)消息被传递到持久队列中
-
(单个)消费者(Spring-AMQP)接收消息并开始处理=>消息从READY转到UNACK
-
现在代理已关闭=>客户端正确报告"Channel shutdown"
-
消费者完成处理,但由于代理仍处于停机状态,因此无法确认消息
-
Broker再次启动=>客户端重新连接
结果,一条消息永远不会被解包(或直到客户端重新启动) .
旁注:在Rabbit Admin UI中,我可以看到现在存在两个通道 . 在代理重启之前创建的“死”,包含未分组的消息和一个 Health 的新消息 .
这种行为是否会像那样?在我觉得“正确”的方式,RabbitMQ在代理重启后无法知道消息处理是否完成 . 但是,存在什么解决方案,而不是将未经处理的消息返回队列并在不重新启动消费者流程的情况下修复系统?
1 回答
RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题 .
是的,您正在观察预期的行为 . 一旦确定消费者真的死了,RabbitMQ就会重新排队 . 由于您的消费者与之前必须使用相同的消费者标签重新连接,因此可以通过该过程来确认消息 .