Rabbitmq:在代理重启后,Unacked消息不会消失

时间:2018-02-21 12:16:32

标签: rabbitmq spring-amqp spring-rabbitmq

我们观察到RabbitMQ的以下行为,并试图了解它是否正确以及如何解决它。

情景:

  1. 将(持久)消息传递到持久队列
  2. (单个)消费者(Spring-AMQP)接收消息并开始处理=>消息从READY转到UNACK
  3. 现在经纪人关闭了=>客户正确报告"频道关闭"
  4. 消费者完成处理,但由于代理仍处于停止状态,因此无法确认消息
  5. 经纪人再次启动=>客户重新连接
  6. 因此,一条消息永远不会被打开(或直到客户端重新启动)。

    旁注:在Rabbit Admin UI中,我可以看到现在存在两个频道。 "死了"在代理重新启动之前创建的一个,包含未分组的消息和一个健康的新消息。

    这种行为是否应该是这样的?在我看来,#14;正确"顺便说一下,R​​abbitMQ在代理重启后无法知道消息处理是否完成。但是,存在什么解决方案,而不是将未经处理的消息返回队列并在不重新启动消费者流程的情况下修复系统?

1 个答案:

答案 0 :(得分:0)

RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题。

  

这种行为是否应该是这样的?在我觉得“正确”的方式,RabbitMQ在代理重启后无法知道消息处理是否完成。

是的,您正在观察预期的行为。一旦确定消费者真的死了,RabbitMQ就会重新排队。由于您的消费者与之前必须使用相同的消费者标签重新连接,因此可以通过该过程来确认消息。