全部产品
云市场

如何处理消息堆积?

更新时间:2019-09-13 22:01:45

除了异步解耦功能,消息队列 MQ 还有挡住前端数据洪峰的重要功能,以此保证后端系统的稳定性。这要求消息队列 MQ 具有一定的消息堆积能力。消息队列 MQ 能支持 10 亿级别的消息堆积,不会因为消息堆积导致性能明显下降。

问题描述

在消息队列 MQ 控制台的消费者状态页面,看到 Group ID 的实时消息堆积量的值高于预期,且性能明显下降。

解决方法

面对消息堆积,且有明显性能下降的情况,可采取以下措施处理:

  1. 消息队列 MQ 控制台,通过查看消费者状态获取消息堆积的消费者实例所对应的宿主机 IP,并登录该宿主机或容器。

  2. 执行以下任一命令查看进程 pid:

    • ps -ef |grep java

    • jps -lm

  3. 执行以下命令查看堆栈信息:

    jstack -l pid > /tmp/pid.jstack

  4. 执行以下命令查看 ConsumeMessageThread 的信息,重点关注线程的状态及堆栈:

    cat /tmp/pid.jstack|grep ConsumeMessageThread -A 10 --color

    命令回显如下图所示。

    命令回显

线程状态的解释说明请参见 Java 官方文档

更多信息

如按以上操作还未解决因消息堆积而导致的性能下降问题,请提交工单。提交时,请附带以下信息:

  • heap.bin 文件

    该文件可通过执行 jmap -dump:format=b,file=heap.bin [pid] 命令获取,再执行 gzip heap.bin 命令生成压缩包。[pid] 是消息堆积处理第一步中找到的进程 pid。

  • 发生消息堆积的消费者客户端ons.log本地日志

  • 消费者客户端的版本