CentOS 环境下 RabbitMQ 消息丢失排查与定位
一 快速定位流程
rabbitmqctl status、rabbitmqctl cluster_status,关注是否有 partitioned 等异常提示。rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers。若 Ready 或 Unacked 在业务无变更时异常下降,可能存在丢失或异常确认。rabbitmqctl list_policies、rabbitmqctl list_queues name slave_nodes synchronised_slave_nodes,确认 HA 同步状态与策略命中队列。df -h、free -m、rabbitmqctl status,资源紧张会触发流控或异常,间接导致消息异常或消失。二 常见根因与对应排查要点
| 环节 | 典型根因 | 快速验证 | 修复建议 |
|---|---|---|---|
| 生产者 | 未启用 confirm/return,网络抖动导致“以为成功” | 日志无 confirm 回调或存在 nack/return | 启用 confirm 与 return;为消息设唯一 msgId 与重试;处理幂等 |
| Broker | 队列/消息未持久化,节点重启即丢 | 队列非 durable 或消息 delivery_mode≠2 | 队列/交换机/消息均持久化;结合 confirm 确保落盘再 ack |
| Broker | 未命中队列被丢弃(无路由) | 开启 return 后收到未路由通知 | 修正 routing key/exchange 绑定;为关键消息配置 mandatory=true 与 DLQ |
| Broker | 集群分区或镜像不同步 | cluster_status 显示 partitioned;synchronised_slave_nodes 为空 |
按策略恢复分区;修复/重建镜像;必要时回放未确认消息 |
| 消费者 | autoAck=true 或处理中宕机 | Unacked 突降且业务未成功 | 改为手动 ack;异常时 nack 并 requeue 或入 DLQ;处理幂等 |
| 资源 | 磁盘满/内存压力触发流控或异常 | df -h/free -m 告警;日志流控提示 |
扩容磁盘/内存;清理无用队列;降低突发流量 |
三 关键命令与操作清单
rabbitmqctl statusrabbitmqctl cluster_statusrabbitmqctl list_queues name messages_ready messages_unacknowledged consumersrabbitmqctl list_policies、rabbitmqctl list_queues name slave_nodes synchronised_slave_nodesrabbitmqctl trace_on,在 amq.rabbitmq.trace 交换器上绑定队列分析路由/丢弃df -h、free -m、rabbitmqctl statusrabbitmqctl set_policy ha-all "^myQueue$" '{"ha-mode":"all","ha-sync-mode":"automatic"}'(策略名与匹配规则按实际调整)四 临时止血与后续加固