消息堆积不是 RabbitMQ 特有的问题只要生产者发送速度长期大于消费者处理速度队列里的消息就会越积越多。面试里问“100 万消息堆积怎么办”本质是在问你能不能判断瓶颈在消费能力、业务耗时还是队列容量。一句话概括RabbitMQ 消息堆积先看生产速度和消费速度是否失衡再从增加消费者、优化消费者内部并发、扩大队列容积三个方向处理惰性队列可以承接大量堆积但会牺牲一定时效性。速度过快处理过慢生产者持续发送Queue消费者处理消息堆积增加消费者消费者内线程池惰性队列扩大容量什么是消息堆积消息堆积指的是生产者发送消息的速度超过消费者处理消息的速度队列中的消息持续增长。每秒生产 5000 条Queue每秒消费 1000 条每秒净增加 4000 条消息持续堆积如果队列设置了长度上限堆积达到上限后新消息可能被拒绝也可能根据策略让旧消息变成死信。最终表现就是延迟越来越高、业务处理滞后、甚至消息丢失。先判断堆积原因不要一上来就说“加机器”。先判断堆积发生在哪一层。排查点现象可能原因生产速度突然升高活动流量、批量任务、上游重试上游限流不足消费速度下降消费者 CPU、DB、外部接口变慢业务处理瓶颈队列容量不足消息很快达到上限队列模式和容量设计不合理消费者频繁失败重试很多、死信变多业务异常或下游依赖故障真正的处理顺序应该是先止血再扩容再优化根因。实际排查时可以重点看这些指标指标说明常见判断队列 ready 数等待投递的消息数持续增长说明消费能力不足unacked 数已投递但未 ACK 的消息数很高说明消费者处理慢或卡住publish rate生产速率突然升高可能是活动流量或上游重试deliver/ack rate投递和确认速率低于生产速率会形成堆积消费失败率重试、死信、异常日志高失败率可能是毒丸消息或下游故障下游耗时DB、Redis、第三方接口耗时下游慢会直接拖慢消费速度ready 高unacked 高发现队列堆积ready 高还是 unacked 高消费能力不足或生产突增消费者处理慢或 ACK 卡住扩消费者/限流/惰性队列查业务耗时/线程池/下游依赖方案一增加更多消费者最直接的方式是增加消费者数量让多个消费者共同消费同一个队列。QueueConsumer 1Consumer 2Consumer 3Consumer 4这个方案适合业务可以并行处理的场景比如短信发送、日志处理、缓存刷新。但要注意两个前提消费逻辑必须是幂等的因为扩容后重复消费和重试仍然可能发生。下游资源要扛得住比如数据库、Redis、第三方接口不能被消费者扩容反过来打垮。方案二消费者内部开启线程池如果消费者实例数量暂时不能扩或者单个消费者处理逻辑可以拆并发可以在消费者内部用线程池提升处理速度。消费者收到消息提交到业务线程池线程 1 处理线程 2 处理线程 3 处理处理完成后 ACK这里有一个容易踩坑的点不要在线程池还没处理完时就提前 ACK。否则线程池里的业务失败了MQ 已经把消息删除消息就真的丢了。更稳的做法是业务处理成功后再 ACK处理失败则 NACK、重试或投递到异常队列。方案三扩大队列容积使用惰性队列RabbitMQ 的惰性队列适合承接大量消息堆积。惰性队列的特点特点说明直接写磁盘接收消息后尽量存入磁盘而不是长期放内存消费时再加载消费者需要时再从磁盘读入内存容量更大可以支持数百万级消息存储时效性下降受磁盘 IO 影响消费延迟可能变高声明队列时可以设置x-queue-modelazyBeanpublicQueuelazyQueue(){returnQueueBuilder.durable(lazy.queue)// 惰性队列适合承接大量堆积但要接受磁盘 IO 带来的延迟。.withArgument(x-queue-mode,lazy).build();}惰性队列不是性能优化而是容量兜底。它让 MQ 在大堆积下更稳定但不会让消费速度凭空变快。三种方案怎么选方案解决的核心问题风险增加消费者提高总体消费能力下游被打满、顺序性被破坏消费者线程池提高单实例处理能力ACK 时机复杂线程池积压惰性队列提高队列堆积上限磁盘 IO 影响时效性如果是临时流量洪峰先扩消费者和限流。如果是长期处理慢要优化业务 SQL、外部接口、批处理逻辑。如果是业务天然有大批量削峰需求再考虑惰性队列做容量设计。面试回答模板可以这样答RabbitMQ 消息堆积说明生产速度超过了消费速度。我会先看堆积增长速度、消费者是否报错、下游数据库或接口是否变慢。处理上有三个方向第一增加消费者实例提高消费并发第二在消费者内部开启线程池加快业务处理但要注意处理成功后再 ACK不能提前确认第三如果业务需要承接大量削峰消息可以使用惰性队列声明队列时设置x-queue-modelazy让消息更多落到磁盘支持更大的堆积量。惰性队列能提高容量但受磁盘 IO 影响时效性会下降。小结消息堆积不是单靠 MQ 配置解决的问题。队列只是缓冲区真正要解决的是生产和消费速度失衡。限流控制生产扩容提高消费优化业务耗时惰性队列容量兜底