知识卡片

未镜像队列在分区中确认静默失败

专业/工作 · 595.b

内容

集群没有配置镜像时,每个队列的进程只存在于它的宿主节点上。发生网络分区后,如果生产者连接的节点上已经没有目标队列的真实进程,交换器路由会直接失败,只要开启mandatory参数配合监听器就能感知并重试,问题相对可控。但对消费端而言,情况更隐蔽:客户端可能仍能”正常”消费到消息且不报任何异常,但对已消费消息的确认(ack)会静默失效,这种问题不报错、难被感知,往往在分区恢复后才会以消息重复消费的形式暴露出来。发散:比起报错的失败,不报错的失败更危险——设计监控和告警时,”看起来一切正常”本身也应该是一个需要主动验证的状态,而不能默认为安全信号。

参考来源

《RabbitMQ实战指南》第10章《网络分区》