问题描述

在使用消息队列 RocketMQ 版实例时收到消息堆积告警,登录消息队列 RocketMQ 控制台后发现了下列现象:

  • 导航栏中选择Group 管理,单击目标Group右侧的消费者状态,在连接信息下方发现堆积量栏的值高于预期。
  • 导航栏中选择消息轨迹,单击创建查询任务,选择按 Message ID 查询,输入对应的信息,发现部分消息已发送至Broker节点,但未投递给下游消费者。

问题原因

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

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

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

  1. 登录消息队列 RocketMQ 版控制台,导航栏中选择资源报表,选择消息消费,输入对应信息,查询历史消费记录。如果消息写入速度大于消息消费速度,则调整业务代码或者对消费者进行扩容。
  2. 登录代码所在服务器,如果存在消息阻塞现象,则多次执行下列命令,连续打印Jstack信息,确认消费线程位置,解决后可尝试重启代码应用,观察消息消费是否恢复正常。
    jstack -l [$PID] | grep ConsumeMessageThread
    说明:[$PID]为运行代码产生的进程ID。
  3. 如果消息堆积量较小,检查阈值是否设置过小导致消息堆积。单击监控报警,单击目标监控项右侧编辑,增加消息堆积的报警阈值。

请按照下列步骤确认问题得到解决:

  1. 登录代码所在服务器,执行下列命令,确认无消费线程阻塞现象。
    jstack -l [$PID] | grep ConsumeMessageThread
  2. 登录消息队列 RocketMQ 版控制台,导航栏中选择Group 管理,单击目标Group右侧的消费者状态。在连接信息下方发现堆积量栏的值下降到正常值。

适用于

  • 消息队列 RocketMQ 版

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。