消息队列RocketMQ版的消息发送至Broker后,配置了Group ID的客户端根据当前的消费位点从Broker拉取部分消息到本地进行消费。消费过程中访问共享资源加锁、I/O和网络资源竞争、HTTP调用未设置超时时间等原因,都会导致单条消息的消费时间很长,消息开始在服务端堆积。
问题确认
- 登录消息队列RocketMQ版控制台,选择 ,堆积量栏的值高于预期。
- 登录消息队列RocketMQ版控制台,选择 ,部分消息已发送至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版控制台,选择 , 栏的值上升,堆积量栏的值下降。