先把当时的情况摆出来。RabbitMQ 3.13 上一个消费者积压两万条 unacked,队列 Ready 数不再下降,消费者进程活着但 CPU 接近零,重启消费者后才恢复。

把日志和配置对完,能解释这个现象的基本就这几处。prefetch_count 设成 1000,消息全压在一个消费者手里。还有一种是处理线程池满了以后回调不再确认,形成死锁。

另外,某条消息处理永久阻塞且没有超时。少数情况下是channel 上开了手动确认但异常路径没 basic_nack。

上来先看队列的待确认消息数

rabbitmqctl list_queues name messages_ready messages_unacknowledged

再往下把 prefetch 降到 20 并重启消费者

python worker.py --prefetch 20 --requeue-on-error

给处理逻辑加超时与 nack 重投

python worker.py --timeout 30 --nack-on-timeout

剩下的就是观察一段时间确认 Ready 持续下降

rabbitmqctl list_queues name messages_ready messages_unacknowledged

怎么算真的好了,看的是同一批现象。unacked 数稳定在 prefetch 上限附近,Ready 数持续下降,消费者 CPU 回到正常水平,没有消息被反复重投。

unacked 堆积本质是确认跟不上投递,prefetch 过大时一条卡住就拖死整批,先限流再看单条处理超时。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189