文档

消息堆积的可能原因及解决办法

更新时间:
一键部署

本文为您介绍云消息队列 RabbitMQ 版消息堆积的可能原因及解决办法。

可能原因

消息堆积一般是由于消费者的消费能力受限或者配置不合理导致的。在堆积出现时,可能是由如下原因导致的:

  • 消费能力不足。这种情况一般出现在发送量较大,而消费者消费耗时较长的时候。在该情况下,消费者的消费速率跟不上发送速率,则队列中便会出现消息堆积。

  • 突发流量。突然的发送流量会导致队列中产生堆积。如果消费者能力足够,这种堆积往往能够慢慢消解。

  • QoS/Prefetch参数设置不合理。这种情况不一定是消费者能力不足,通过扩容消费者不一定能够解决。例如一个消费者的Prefetch Count参数为100条,每条消息需要30秒,则处理完这一批消息需要3000秒,而最长消费时间只有300秒,这样每个消费者只有前10条消息能够被正常消费,后续所有消息都将消费失败,消息将出现堆积。

解决办法

  1. 通过如下方法确认消费者是否连接,并正常工作。

    1. 开启消息日志服务,查看堆积队列的PushMessage事件量是否符合预期。具体操作,请参见配置消息日志

    2. 控制台进入堆积队列的界面,查看消费者IP数量是否符合预期。

      image

    3. 进入堆积队列的Dashboard,查看各个消费者的消费时长是否符合预期。

      image

      如上图所示,各个消费者的消费时长是符合预期的,但是如果出现下面这种情况,则代表该消费的所有消息消费均超时。

      image

  2. 针对QoS/Prefetch等参数设置,请参见消费消息时需要注意什么?

    此外,可以根据该公式计算最佳QoS值:QoS = 最长消费时长/单条消息的最长处理时长。

  3. 可以观察消费进程负载情况,并尝试扩容消费者,一般情况下,堆积能够通过扩容消费者缓解。