为何Kafka KStream在数据库错误率高时持续触发重平衡?
数据库错误率高引发KStream消费者持续重平衡的原因
消费者心跳超时:当数据库插入因唯一约束报错时,消费者线程可能卡在异常重试、错误日志打印或复杂的异常处理逻辑里,没法按时给Kafka Broker发送心跳。Kafka默认的
session.timeout.ms是30秒,一旦超过这个时间Broker收不到心跳,就会判定该消费者已失效,直接触发消费组重平衡。消费位移提交失败:如果数据库异常导致消费者无法正常调用
commitSync()或commitAsync()提交消费位移,Broker会认为该消费者状态异常。或者当其他消费者发现某个成员的消费位移长时间没有更新,也会触发重平衡来重新分配分区。poll操作超时:Kafka要求消费者必须定期调用
poll()拉取消息,默认的max.poll.interval.ms是5分钟。当大量重复数据触发数据库报错,消费者线程被异常处理逻辑占用,长时间无法执行poll(),Broker就会把这个消费者踢出消费组,进而引发重平衡。如果错误持续发生,这个过程会反复触发,导致持续重平衡。消费者线程崩溃重启:如果没有正确捕获数据库的唯一约束异常,导致未处理的异常直接抛出,会造成消费者线程崩溃。线程重启后重新加入消费组,必然触发一次重平衡。错误率高的时候,线程会反复崩溃重启,就会出现持续重平衡的情况。
内容的提问来源于stack exchange,提问作者Ajith Ahangama Vitharanalage
相关产品推荐
相关产品推荐

