一、背景
kafka消息总量10亿/天,每分钟生成70万条消息,生成环境部署了12个服务,消费2个Topic,每个Topic部署12个分区
二、现象问题
- 消费者方面
1、单个服务,同时消费2个不同Topic的2个分区,一个分区消费正常,一个分区停止消费,异常分区的Lag出现积压,出现异常没有时间规律。
2、消费者的配置参数,如下图
- kafka服务器方面
1、查询消费组状态,发现Topic的分区4发生积压
2、在此期间,kafka、zk的集群状态正常,服务端日志无相关报错信息
3、积压恢复后相关日志排查,发现消费者ID(consumer-3-5b6d2a-6989-377409)在过程中无法继续发送心跳,被判断为消费者已经下线,从该消费组中移除。如果消费者下线一段时间后,在这期间没有其他消费者从该分区中消费消息,那Lag将发生积压。
三、排查思路和过程
1、查看资料,消费者配置参数(max.poll.interval.ms)设置为10分钟,此参数的作用定义了消费者处理单个调用poll()方法的最大时间,如果在此时间内未调用poll(),则kafka服务器会认为消费者已经死亡,并将其标记为离线,同时触发rebalance,将分区进行重新分配,但是实际情况是kakfa服务器没有出发rebalance,造成分区没有被其他正常消费者继续消费,最终导致分区消息积压。
四、分析总结
1、经过不断尝试验证,以及出问题前后时间节点上,各个方面的调整分析,最后初步判断是kafka服务器版本升级后,不兼容springboot kafka clietn版本导致,于是升级将spring-kafka从2.3.7升级到2.4.1,同时建kafka-clients升级到2.4.1,问题解决。