生产经验——分区的分配以及再平衡

生产经验——分区的分配以及再平衡_第1张图片

Range 以及再平衡

生产经验——分区的分配以及再平衡_第2张图片

实操:

(1)修改主题 first 为 7 个分区。

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic first --partitions 7

生产经验——分区的分配以及再平衡_第3张图片

         复制 CustomConsumer 类,创建 CustomConsumer2。这样可以由三个消费者 CustomConsumer、CustomConsumer1、CustomConsumer2 组成消费者组,组名都为“test”, 同时启动 3 个消费者,他们都在一个组别中。

启动 CustomProducer 生产者,发送 500 条消息,随机发送到不同的分区:

消费者1:消费 0,1,2分区的数据:

生产经验——分区的分配以及再平衡_第4张图片

消费者2:消费3,4分区的数据:

生产经验——分区的分配以及再平衡_第5张图片

消费者3:消费5,6分区的数据:

生产经验——分区的分配以及再平衡_第6张图片

        此时做一个破坏性实验,把消费者1干掉,我们发现,前45s, 消费者2和消费者3正常接收数据,而45s后,认为消费者1退出消费者组,因此消费者1的数据会给整体给别人接受。

        如果此时再发送一波数据,那么消费者2消费0,1,2,3分区的数据,消费者3消费4,5,6分区的数据。

RoundRobin 以及再平衡

生产经验——分区的分配以及再平衡_第7张图片

        依次在 CustomConsumer、CustomConsumer1、CustomConsumer2 三个消费者代 码中修改分区分配策略为 RoundRobin。

 //设置分区分配策略
      properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,"org.apache.kafka.clients.consumer.RoundRobinAssignor");

消费者2:消费 1,4分区的数据: 

生产经验——分区的分配以及再平衡_第8张图片

 消费者0:消费0,3,6分区的数据:

生产经验——分区的分配以及再平衡_第9张图片

 消费者1:消费2,5分区的数据:生产经验——分区的分配以及再平衡_第10张图片

        此时做一个破坏性实验:将消费者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");

 三个消费者正常工作时,可以看到会尽量保持分区的个数近似划分分区。生产经验——分区的分配以及再平衡_第11张图片

你可能感兴趣的:(kafka)