Range 以及再平衡
实操:
(1)修改主题 first 为 7 个分区。
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic first --partitions 7
复制 CustomConsumer 类,创建 CustomConsumer2。这样可以由三个消费者 CustomConsumer、CustomConsumer1、CustomConsumer2 组成消费者组,组名都为“test”, 同时启动 3 个消费者,他们都在一个组别中。
启动 CustomProducer 生产者,发送 500 条消息,随机发送到不同的分区:
消费者1:消费 0,1,2分区的数据:
消费者2:消费3,4分区的数据:
消费者3:消费5,6分区的数据:
此时做一个破坏性实验,把消费者1干掉,我们发现,前45s, 消费者2和消费者3正常接收数据,而45s后,认为消费者1退出消费者组,因此消费者1的数据会给整体给别人接受。
如果此时再发送一波数据,那么消费者2消费0,1,2,3分区的数据,消费者3消费4,5,6分区的数据。
RoundRobin 以及再平衡
依次在 CustomConsumer、CustomConsumer1、CustomConsumer2 三个消费者代 码中修改分区分配策略为 RoundRobin。
//设置分区分配策略
properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,"org.apache.kafka.clients.consumer.RoundRobinAssignor");
消费者2:消费 1,4分区的数据:
消费者0:消费0,3,6分区的数据:
消费者1:消费2,5分区的数据:
此时做一个破坏性实验:将消费者0干掉,0 号消费者的任务会按照 RoundRobin 的方式,把数据轮询分成 0 、6 和 3 号分区数据, 分别由 1 号消费者或者 2 号消费者消费。
说明:0 号消费者挂掉后,消费者组需要按照超时时间 45s 来判断它是否退出,所以需要等待,时间到了 45s 后,判断它真的退出就会把任务分配给其他 broker 执行。发现1处理:2,5,3发现2处理:1,4,0,6
(2)再次重新发送消息观看结果(45s 以后)。 1 号消费者:消费到 0、2、4、6 号分区数据 2 号消费者:消费到 1、3、5 号分区数据 说明:消费者 0 已经被踢出消费者组,所以重新按照 RoundRobin 方式分配。
Sticky 以及再平衡
可以理解为分配的结果带有“粘性的”。即在执行一次新的分配之前, 考虑上一次分配的结果,尽量少的调整分配的变动,可以节省大量的开销。
// 修改分区分配策略
properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,
"org.apache.kafka.clients.consumer.StickyAssignor");
三个消费者正常工作时,可以看到会尽量保持分区的个数近似划分分区。