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

使用云消息队列 Kafka 版时,可能会发现Group中出现消息堆积。本文介绍如何判断消息堆积是否属于正常情况,以及处理方法。

客户端消费流程

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

image

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

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

  1. 登录云消息队列 Kafka 版控制台

  2. 在顶部菜单栏,选择地域。

  3. 在左侧导航栏,单击实例列表

  4. 实例列表页面,单击目标实例名称。

  5. 实例详情页面,单击左侧菜单栏中的Group管理

  6. Group管理页面,找到目标Group,在其操作列,选择更多>消费状态

  7. 消费状态页签,每间隔1分钟记录一次各个Topic分区的最近消费时间堆积量消息位点,然后进行下列判断:

    说明

    消息位点可通过单击详情按钮进行查看。

    • 最近消费时间与当前时间接近,并且堆积量保持在一个稳定的数值之间波动,没有持续扩大。 说明客户端一直在拉取最新消息,没有消息堆积,属于正常情况。

      说明

      消息堆积量会根据消息量、消费端位点提交频率的变化而变化,数值大并不一定表示堆积。例如,某个Topic的发送频率为10000 tps,消费端位点提交频率为1 s提交1次,正常情况下展示的堆积量可能会一直在10000左右波动,但并非意味着消息堆积了。

    • 堆积量逐步扩大,并且消息位点一直不变。 客户端的消费线程因为某些原因卡住,没有继续消费,也没有继续向服务端提交位点,属于异常情况,即消息的确堆积了。请参见下文的消息堆积的处理方式章节进行处理。

    • 堆积量逐步扩大,同时消费位点在前进。 说明客户端还在消费中,但是消息的消费速度慢于消息的发送速度。由于消息是客户端主动从服务端批量拉取,客户端消费流程中的步骤1一般不会是消费的瓶颈。此时,需要排查步骤2的消费耗时,请参见下文的消息堆积的处理方式章节进行处理。

      说明

      消息堆积大多是消费速度过慢或者消费线程阻塞造成的,建议不要在消费逻辑中有太多耗时的操作。

    • 分区消息堆积,下游消费却无异常。下游可能采用了assign消费模式,位点是您自己管理的。这种情况下虽然显示了堆积,实际上您可能已经消费了,但是没有提交位点。建议您及时手动提交位点解决消息堆积问题。

消息堆积的处理方式

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

  • 增加Consumer实例个数。可以在进程内直接增加(需要保证每个实例对应一个线程),也可以部署多个消费实例进程。需要注意的是,实例个数超过分区数量后就不再能提高速度,否则将会有消费实例不工作。

  • 增加消费线程。更多信息,请参见提高消费速度

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

  • 若出现消息堆积,同时控制台上消费状态出现异常,可能有Rebalance 现象,在Rebalance期间不会进行消费,导致大量堆积,具体原因是有大量客户端在此上下线。更多信息,请参见为什么消费客户端频繁出现Rebalance?

相关文档