全部产品
云市场

消息队列 MQ 用户收到堆积告警后怎么办?

更新时间:2019-09-13 22:00:19

问题确认

  • 登录消息队列 MQ 控制台,选择 Group 管理 > 消费者状态堆积量栏的值高于预期。

  • 登录消息队列 MQ 控制台,选择消息轨迹 > 创建查询任务 > 按 Message ID 查询,部分消息已发送至 Broker,但未投递给下游消费者。

问题分析

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

解决方案

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

  • 登录消息队列 MQ 控制台,选择资源报表 > 消息消费,查询历史消费记录。如果消息写入速度大于消息消费速度,调整业务代码或对消费者进行扩容。

  • 在应用打印 Jstack 信息 jstack -l {pid} | grep ConsumeMessageThread。如果有消息阻塞现象,连续打印 5 次 Jstack 信息,确认消费线程卡在哪里,解决后可尝试重启应用观察消费是否恢复。

  • 如果消息已经没有堆积,检查阈值是否设置过小导致消息堆积,单击监控报警,单击编辑,增大消息堆积的报警阈值。

结果验证

  • 在应用打印 Jstack 信息 jstack -l {pid} | grep ConsumeMessageThread,无消费线程阻塞现象。

  • 登录消息队列 MQ 控制台,选择 Group 管理 > 消费者状态消费 TPS 栏的值上升,堆积量栏的值下降。