RabbitMQ 集群中镜像上持久消息的行为

Behaviour of persistent messages on a mirrored in a RabbitMQ cluster

我想弄清楚在只有持久消息的镜像队列中,是否仍然有可能在重新同步过程中丢失消息。

如果我有一个跨两个节点镜像的队列(以简化示例)。 交换器和队列是持久的,所有消息都标记为持久性。

主队列在节点 1 上 镜像队列在节点 2

场景是

  1. 最初队列是同步的
  2. 节点 2 宕机
  3. 节点 2 恢复
  4. 节点 2 同步之前节点 1 丢失
  5. 节点2成为master

在第 3 步,节点 2 恢复,它是从它保存的消息存储中加载消息,还是从没有消息开始并开始同步(通过两种标准的重新同步方法)

在镜像队列的情况下,每个队列是否都有自己的消息存储。

如果这种情况确实会丢失消息,是否有可以避免这种情况的情况

看来如果出现这种情况,无论你的配置如何,消息都会丢失。为了缓解这个问题,解决方案是确保

  • 确保消息持久化

  • 队列和交换是持久的

  • 确保使用消费者确认并将其设置为仅 确认消息何时提交给 master 和所有 镜像副本。

  • 确保有适当数量的镜像副本,以便 避免陷入没有同步的情况 队列

吞吐量性能会受到影响。