发现以下这种情况出现时, 无法避免消息丢失.
由于希望高可用, 集群队列一般都设置为持久化, lazy, 镜像队列
假设 RMQ 集群有 5 个节点: node[1:5]
假设队列 q 为一主一从, 队列进程分别在 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 路由到目标队列中去了. 造成了消息的丢失.
来源: http://www.jianshu.com/p/1b1cda53185c