消息队列RocketMQ版的消息发送至Broker后,配置了Group ID的客户端根据当前的消费位点从Broker拉取部分消息到本地进行消费。消费过程中访问共享资源加锁、I/O和网络资源竞争、HTTP调用未设置超时时间等原因,都会导致单条消息的消费时间很长,消息开始在服务端堆积。

问题确认

  • 登录消息队列RocketMQ版控制台,选择Group管理 > 消费者状态堆积量栏的值高于预期。
  • 登录消息队列RocketMQ版控制台,选择消息轨迹 > 创建查询任务 > 按Message ID查询,部分消息已发送至Broker,但未投递给下游消费者。

问题分析

消息队列RocketMQ版的消息发送至Broker后,配置了Group ID的客户端根据当前的消费位点从Broker拉取部分消息到本地进行消费。消费过程中访问共享资源加锁、I/O和网络资源竞争、HTTP调用未设置超时时间等原因,都会导致单条消息的消费时间很长,消息开始在服务端堆积。

解决方案

请按照如下方法排查并解决问题:

  • 登录消息队列RocketMQ版控制台,选择资源报表 > 消息消费,查询历史消费记录。如果消息写入速度大于消息消费速度,调整业务代码或对消费者进行扩容。
  • 在应用打印Jstack信息jstack -l {pid} | grep ConsumeMessageThread。如果有消息阻塞现象,连续打印5次Jstack信息,确认消费线程卡在哪里,解决后可尝试重启应用观察消费是否恢复。
  • 如果消息已经没有堆积,检查阈值是否设置过小导致消息堆积,单击监控报警,单击编辑,增大消息堆积的报警阈值。

结果验证

  • 在应用打印Jstack信息jstack -l {pid} | grep ConsumeMessageThread,无消费线程阻塞现象。
  • 登录消息队列RocketMQ版控制台,选择Group管理 > 消费者状态 > 消费TPS, 栏的值上升,堆积量栏的值下降。