背景
通过监控发发现topic消费状态不正常
image.png
原因
kafka在业务消费500条数据处理时间超过5分钟时会引起消费者的rebalance,从而影响消费速率甚至数据重复问题。
解决
- 从kafka server端拉取数据量由500降低为60
- 业务处理超时时间由原来5分钟增加为10分钟,可根据业务场景进行调整
Properties props = new Properties();
props.put("max.poll.interval.ms", 60 * 1000 * 10); //10分钟
props.put("max.poll.records",60) // 从kafka server一次拉取数据量 60条
常见问题
问题1 因业务处理能力低导致的rebalance后以前老的消费者是否可以ack?
消费者不再持有分区权限,无法提交ack
问题2 有问题消费者能否再获取到分区消费权限
kafka consumer有心跳线程,poll线程两个独立线程;在poll超时后触发rebalance,不会影响他的下次再分配权限;因为心跳还在只是处理慢,心跳再次上报成功认为该消费者是正常状态。
因此consumer1在因业务超时触发rebalance后,仍然能够再次分配到分区的
问题3 上述情况为啥不阻塞分区消费
consumer 1 取到超时消息触发rebalance,consumer1失去ack权限
consumer1 心跳正常发送,协调这认为consumer1恢复正常
consumer 2 取到超时消息触发rebalance,consumer2失去ack权限
consumer2 心跳正常发送,协调这认为consumer2恢复正常
...
一直到consumer1,重新持有分区权限,在业务处理的消息结束,提交ack成功,分区才能继续往下消费,只是消费低
问题4 消费监控跌倒0原因
rebalance期间,消费会停止重新分配成功后再次开始消费
问题5 分区业务处理慢会阻塞整个topic
如果大消息只出现在一个分区中,不会阻塞整个topic的消费,只会影响大消息的分区数据