我们观察到了 RabbitMQ 的以下行为,并试图了解它是否正确以及如何解决它。
设想:
- (持久)消息被传递到持久队列中
- (单个)消费者(Spring-AMQP)获取消息并开始处理 => 消息从 READY 变为 UNACK
- 现在代理已关闭 => 客户端正确报告“通道关闭”
- 消费者完成处理,但无法确认消息,因为代理仍处于关闭状态
- Broker 再次启动 => 客户端重新连接
结果,一条消息永远保持未确认状态(或直到客户端重新启动)。
旁注:在 Rabbit 管理 UI 中,我可以看到现在存在两个频道。在代理重新启动之前创建的“死”消息,包含未确认的消息和一条健康的新消息。
这种行为是预期的那样吗?在我看来,这种方式“正确”,RabbitMQ 在代理重新启动后无法知道消息处理是否完成。但是,除了将未确认的消息放回队列并在不重新启动消费者进程的情况下修复系统之外,还有什么解决方案呢?
这种行为是预期的那样吗?在我看来,这种方式“正确”,RabbitMQ 在代理重新启动后无法知道消息处理是否完成。
是的,您正在观察预期的行为。一旦确定消费者确实死亡,RabbitMQ 就会重新将消息重新入队。由于您的消费者重新连接的消费者标签必须与之前相同,因此由该进程来确认或确认消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)