概述
使用消息队列Kafka版时,可能会发现Group中出现消息堆积。该情况是否属于正常情况,以及如何处理,请参见以下内容。
详细信息
客户端消费流程
了解客户端消费流程,有助于理解消息是否堆积。一般情况下,客户端消费流程大致如下:
步骤1 |
步骤2 |
步骤3 |
消费端调用服务端接口主动拉取消息。
|
拉取到消息后,执行客户端消费逻辑。
|
消费成功后,如果超过位点提交间隔,提交位点到服务端;如果没有超过位点提交间隔,则下次消费完成后再提交,一般建议间隔1~2s。
|
判断消息堆积是否属于正常情况
如果发现Group中出现消息堆积,请参见下列步骤,判断消息堆积是否属于正常情况:
- 登录消息队列Kafka版控制台。
- 在顶部菜单栏,选择地域。
- 在左侧导航栏,单击实例列表。
- 在实例列表页面,单击目标实例名称。
- 在实例详情页面,单击左侧菜单栏中的Group管理。
- 在Group管理页面,找到目标Group,在其操作列,选择 。
- 在消费状态页面,每间隔1分钟记录一次各个Topic分区的最近消费时间、堆积量和消息位点,然后进行下列判断:
说明:消息位点可通过单击详情按钮进行查看。
- 最近消费时间与当前时间接近,并且堆积量保持在一个稳定的数值之间波动,没有持续扩大。
说明客户端一直在拉取最新消息,没有消息堆积,属于正常情况。
注意:消息堆积量会根据消息量、消费端位点提交频率的变化而变化,数值大并不一定表示堆积。例如,某个Topic的发送频率为10000tps,消费端位点提交频率为1s提交1次,正常情况下展示的堆积量可能会一直在10000左右波动,但并非意味着消息堆积了。
- 堆积量逐步扩大,并且消息位点一直不变。
客户端的消费线程因为某些原因卡住,没有继续消费,也没有继续向服务端提交位点,属于异常情况,即消息的确堆积了。请参见消息堆积的处理方式章节进行处理。
- 堆积量逐步扩大,同时消费位点在前进。
说明客户端还在消费中,但是消息的消费速度慢于消息的发送速度。由于消息是客户端主动从服务端批量拉取,客户端消费流程中的步骤1一般不会是消费的瓶颈。此时,需要排查步骤2的消费耗时,请参见消息堆积的处理方式章节进行处理。
说明:消息堆积大多是消费速度过慢或者消费线程阻塞造成的,建议不要在消费逻辑中有太多耗时的操作。
消息堆积的处理方式
经过上述判断,确认消息的确存在堆积情况时,建议打印消息的消费耗时,或者根据堆栈信息查看线程执行情况,适当调整以加快消息的消费速度,避免出现消息堆积。
说明:Java进程可以通过Jstack打印消费者进程的堆栈信息。
相关文档
适用于