Kafka数据使用多线程阻塞的方式进行消费,即每个线程通过poll()的形式消费一个或者多个partition, 每次得到的消息集处理完成之后才会继续进行下一次poll()操作,同时使用了自动提交offset的模式。
Rebalance发生的原因有可能是集群的问题,但大部分都在客户端,一旦服务端在设定的超时时间内没有收到消费者发起的心跳,则认为这个消费者已经死掉,就会执行Rebalance动作。
Rebalance本身是Kafka集群的一个保护设定,用于剔除掉无法消费或者过慢的消费者,然后由于我们的数据量较大,同时后续消费后的数据写入需要走网络IO,很有可能存在依赖的第三方服务存在慢的情况而导致我们超时。 Kafka
Rebalance 对我们数据的影响主要有以下几点:
- 数据重复消费: 消费过的数据由于提交 offset 任务也会失败,在 partition 被分配给其他消费者的时候,会造成重复消费,数据重复且增加集群压力
- Rebalance 扩散到整个 ConsumerGroup 的所有消费者,因为一个消费者的退出,导致整个Group 进行了 Rebalance,并在一个比较慢的时间内达到稳定状态,影响面较大
- 频繁的 Rebalance 反而降低了消息的消费速度,大部分时间都在重复消费和Rebalance
- 数据不能及时消费,会累积 lag,在 Kafka 的TTL之后会丢弃数据