使用云消息队列 Kafka 版时,可能会发现Group中出现消息堆积。本文介绍如何判断消息堆积是否属于正常情况,以及处理方法。
客户端消费流程
了解客户端消费流程,有助于理解消息是否堆积。一般情况下,客户端消费流程大致如下:
判断消息堆积是否属于正常情况
如果发现Group中出现消息堆积,请参见下列步骤,判断消息堆积是否属于正常情况:
消息堆积的处理方式
经过上述判断,确认消息的确存在堆积情况时,建议打印消息的消费耗时,或者根据堆栈信息查看线程执行情况。根据以下方案适当调整以加快消息的消费速度,避免出现消息堆积。
增加Consumer实例个数。可以在进程内直接增加(需要保证每个实例对应一个线程),也可以部署多个消费实例进程。需要注意的是,实例个数超过分区数量后就不再能提高速度,否则将会有消费实例不工作。
增加消费线程。更多信息,请参见提高消费速度。
Java进程可以通过Jstack打印消费者进程的堆栈信息。
若出现消息堆积,同时控制台上消费状态出现异常,可能有Rebalance 现象,在Rebalance期间不会进行消费,导致大量堆积,具体原因是有大量客户端在此上下线。更多信息,请参见为什么消费客户端频繁出现Rebalance?。
若出现
read tcp i/o timeout错误导致消息堆积,垂直扩容 Kafka 实例通常不能直接解决该问题。该错误更多与网络连通性或客户端配置有关,建议按以下步骤排查:检查客户端与服务端之间的网络连通性是否稳定。
确认客户端版本,若低于 0.10.2 建议升级。
调整客户端参数
max.poll.interval.ms和session.timeout.ms,避免因处理超时触发 Rebalance。通过控制台查看消费状态页签,确认堆积量和位点变化是否符合预期。仅当确认是服务端资源瓶颈导致的超时时,才考虑扩容。
相关文档
关于Jstack的更多信息,请参见Oracle JDK中Jstack命令的介绍。
更多常见问题,请参见云消息队列 Kafka 版使用中的常见问题。