rabbitmqctl list_queues name messages messages_ready
# 确认营销队列 messages_ready 持续增长而 consumers 为 0
rabbitmqctl set_policy fair '^marketing\.' '{"max-length":100000}' --apply-to queues

队列按 0 到 9 分了 10 个优先级,营销任务用 9,三天里一条都没执行,高优先级任务一直以每秒 40 条的速度进来。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:broker 的优先级严格按级别取,只有高优先级队列空了才看下一级。生产速度长期高于消费速度,低级别永远轮不到。

围绕「优先级队列饿死」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:把优先级从 10 级压到 3 级 级差不要太大;给低优先级队列配最小消费配额 每消费 10 条高优先级必须取 1 条低的;或者把低优先级任务放独立队列 用独立 worker 保底;观察低优先级任务等待时间 确认不再无限增长。

确认没问题再收工,营销队列的消费者在 10 分钟内开始有吞吐 等待时间不再持续上涨。

作者 9823189