使用消息队列Kafka版时出现消息堆积

概述

使用消息队列Kafka版时,可能会发现Group中出现消息堆积。该情况是否属于正常情况,以及如何处理,请参见以下内容。

详细信息

客户端消费流程

了解客户端消费流程,有助于理解消息是否堆积。一般情况下,客户端消费流程大致如下:

步骤1 步骤2 步骤3

消费端调用服务端接口主动拉取消息。

拉取到消息后,执行客户端消费逻辑。

消费成功后,如果超过位点提交间隔,提交位点到服务端;如果没有超过位点提交间隔,则下次消费完成后再提交,一般建议间隔1~2s。

判断消息堆积是否属于正常情况

如果发现Group中出现消息堆积,请参见下列步骤,判断消息堆积是否属于正常情况:

  1. 登录消息队列Kafka版控制台
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏,单击实例列表
  4. 实例列表页面,单击目标实例名称。
  5. 实例详情页面,单击左侧菜单栏中的Group管理
  6. Group管理页面,找到目标Group,在其操作列,选择更多>消费状态 。
  7. 消费状态页面,每间隔1分钟记录一次各个Topic分区的最近消费时间堆积量消息位点,然后进行下列判断:
    说明:消息位点可通过单击详情按钮进行查看。
    • 最近消费时间与当前时间接近,并且堆积量保持在一个稳定的数值之间波动,没有持续扩大。
      说明客户端一直在拉取最新消息,没有消息堆积,属于正常情况。
      注意:消息堆积量会根据消息量、消费端位点提交频率的变化而变化,数值大并不一定表示堆积。例如,某个Topic的发送频率为10000tps,消费端位点提交频率为1s提交1次,正常情况下展示的堆积量可能会一直在10000左右波动,但并非意味着消息堆积了。
    • 堆积量逐步扩大,并且消息位点一直不变。
      客户端的消费线程因为某些原因卡住,没有继续消费,也没有继续向服务端提交位点,属于异常情况,即消息的确堆积了。请参见消息堆积的处理方式章节进行处理。
    • 堆积量逐步扩大,同时消费位点在前进。
      说明客户端还在消费中,但是消息的消费速度慢于消息的发送速度。由于消息是客户端主动从服务端批量拉取,客户端消费流程中的步骤1一般不会是消费的瓶颈。此时,需要排查步骤2的消费耗时,请参见消息堆积的处理方式章节进行处理。
      说明:消息堆积大多是消费速度过慢或者消费线程阻塞造成的,建议不要在消费逻辑中有太多耗时的操作。

消息堆积的处理方式

经过上述判断,确认消息的确存在堆积情况时,建议打印消息的消费耗时,或者根据堆栈信息查看线程执行情况,适当调整以加快消息的消费速度,避免出现消息堆积。

说明:Java进程可以通过Jstack打印消费者进程的堆栈信息。

相关文档

适用于

  • 消息队列Kafka版