在Kafka的一个consumer group中有多个consumer组成,一个 topic有多个partition组成,现在的问题是,到底由哪个consumer来消费哪个partition的数据。
Kafka有四种主流的分区分配策略: Range、RoundRobin、Sticky、CooperativeSticky。可以通过配置参数partition.assignment.strategy,修改分区的分配策略。默认策略是Range + CooperativeSticky。
这里简单对"Range"这一种分配策略进行本地测试。场景为:"first" topic下7个Partition,一个消费组下3个consumer
先将 fisrt 主题修改为7个分区
将一个消费组下的三个consumer启动起来
同时启动生产者发送500条数据
Range的分配策略:通过 partitions数/consumer数 来决定每个消费者应该消费几个分区。如果除不尽,那么前面几个消费者将会多消费 1 个分区。
consumer0 5和6分区
consumer1 3和4分区
consumer2 0、1和2分区
分区和消费者的编号在kafka内部会重新编排
在其中一个消费者被停后,45秒(消费者组需要按照超时时间 45s 来判断它是否退出,所以需要等待,时间到了 45s 后,判断它真的退出就会把任务分配给其他 broker 执行)后会将该消费者的消费数据分配给组内其他成员。