RabbitMQ集群出现网络分区,可能会丢数据

发现以下这种情况出现时,无法避免消息丢失。

由于希望高可用,集群队列一般都设置为持久化、lazy、镜像队列

假设RMQ集群有5个节点:node[1:5]

假设队列  为一主一从,队列进程分别在 node1、node3节点。

分区前:


假设队列 q 的master、slave进程所在节点: node1和 node3  与  node2, node4, node5  之间的网络中断了,此时


此刻两者之间的网络通信并未恢复。这种中间状态很有可能导致数据丢失,分析如下:


之前打到 node1, node3 上的生产者连接 producer client #1,可以正常继续向队列 q 上发消息。

而打到 node2, node4, node5 上的生产者连接 producer client #2,无法感知到队列q不处在当前小块集团节点中(集团中没有队列q进程)。Queue不同于Exchange、Bindings,队列进程只存在于其master和slaves节点中。而此时生产者即使使用了confirm、returnListener等机制,消息还是到达不了目标队列q(尤其是上游通过exchange发送,下面挂了多个队列),但发送方依然可以收到服务器返回的Ack,认为消息已经通过exchange路由到目标队列中去了。造成了消息的丢失。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容