Kafka Reblance & max.poll.interval.ms 重复消费问题

1. 什么是kafka Reblance?

    消费组是MQ中一个非常重要的概念,一个消费组监听一个Topic时,Kafka服务端会给消费组中的每一个实例,进行队列分配,每一个实例指定消费一个或多个队列(分区),当然如果消费实例数量如果超出了队列数量,那么会出现消费实例不监听任何队列的情况。
    当一个消费实例加入或者退出消费组时,那么消费实例的数量会变化,服务端有责任将消息队列(分区), 尽可能均衡的平分给所有消费实例,这时就会出现rebalance。

2. 什么是max.poll.interval.ms?

     max.poll.interval.ms 消费端的配置参数:最大poll间隔毫秒数,指定两次poll的最大间隔,默认5分钟。如果超出了,那么Kafka服务端会认为当前消费实例,已经不可用了,那么这个时候消费组的实例数量就会减1,同步导致需要rebalance。

3. 重复消费在什么情况下会和以上信息产生关联?

     当一个消费实例poll一次之后,进行业务逻辑处理,如果处理的时间过长,超出了max.poll.interval.ms,此时虽然消费实例依然活着,但是Kafka服务端已经认为该实例不可用,那么进行reblance,把当前属于该实例的队列(分区) 分配给其他实例,由于这些被消费的队列的offset还没有被提交,导致新的消费实例会重新消费当前的消息。

4. 合理的建议

     一次poll少量的数据保证业务处理时间不会超出 max.poll.interval.ms 的配置,同时增加消费的幂等逻辑。

5. 为什么Kafka会用poll的频率来判定实例的死活呢?

     通常判定实例的可用性,一般是通过心跳机制来实现,但是似乎早期的Kafka没有心跳机制,且消费端的poll轮询,在某种程度上等同于心跳,所以才会有通过poll频率来判定实例是否可用。KIP-62及之后,引入了单独的心跳线程,max.poll.interval.ms是poll最大间隔秒数,session.timeout.ms是心跳间隔最大秒数,默认30秒,不论哪一个超时都会导致消费实例被下线。具体可参见这个stackOverFlow里的这个回答

posted on 2022-12-30 15:42  mindSucker  阅读(464)  评论(0编辑  收藏  举报