RabbitMQ消息中间件

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

2019-02-24  本文已影响34人  shuangji

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

由于希望高可用,集群队列一般都设置为持久化、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路由到目标队列中去了。造成了消息的丢失。

上一篇下一篇

猜你喜欢

热点阅读