生产事故:RabbitMQ 内存告警导致整个集群不可用——"流量控制"的连环陷阱
引言 周三下午,订单系统突然全线报错。监控大屏上 RabbitMQ 集群三个节点的内存指示灯齐刷刷变红,业务侧表现却是"冰火两重天": 上游:订单服务发消息全部卡住,接口超时——生产者被 MQ 拒绝接收; 下游:通知服务、积分服务的消费者日志一片寂静——消费者"拿不到"消息; 队列里:明明积压了几十万条消息,消费速率却是 0。 消息既进不去、也出不来,整个异步业务链路在十分钟内彻底断开。复盘后发现,触发点小到令人发指:两天前一次消费者重构,把 ACK 模式改成了手动确认,但代码里异常分支既不 ack 也不 nack——消息被消费者"领走"后永远没有"交差",unacked 计数爬到上限后消费者不再被投递,队列只进不出,两天的积压最终撞穿内存水位线,触发了 RabbitMQ 最让人头疼的保护机制:Flow Control(流量控制)。 这篇文章把事故完整复盘:RabbitMQ 的内存水位与流控机制是怎么一环扣一环地锁死集群的、手动 ACK 为什么会变成"消息黑洞"、修复方案和监控体系怎么建——重点不是骂代码,而是讲清楚这个连环陷阱的每一步,让它不会在你身上重演。 一、事故时间线:1....