kafka 消费者的消费策略以及再平衡
Posted 健康平安的活着
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka 消费者的消费策略以及再平衡相关的知识,希望对你有一定的参考价值。
一 kafka的消费策略
1 、一个 consumer group 中有多个 consumer 组成,一个 topic 有多个 partition 组成,现在的问题是, 到底由哪个 consumer 来消费哪个partition的数据 。 2 、 Kafka 有四种主流的分区分配策略: Range 、 RoundRobin 、 Sticky 、 CooperativeSticky 。 可以通过配置参数 partition.assignment.strategy ,修改分区的分配策略。默认策略是 Range + CooperativeSticky 。 Kafka 可以同时使用 多个分区分配策略。 3.策略判断参数![](https://image.cha138.com/20220414/5361b4fe8e55458abd0b002c804959d9.jpg)
![](https://image.cha138.com/20220414/62bd39f69c7d4e86b2200f19750cb9b5.jpg)
1. 每个consumer都 发送JoinGroup请求
2.选出一个 consumer作为 leader 3.把要消费的 topic 情况 发送给leader 消费者 4. leader 会负 责制定消费方案 5. 把消费方案发给 coordinator 6. Coordinator 就把消费 方案下发给各个consumer 7.每个消费者都会和 coordinator 保持心跳( 默认 3s ),一旦超时 session.timeout.ms= 45s ),该消费者会被移除,并触发再平衡;或者消费者处理消息的过长(max.poll.interval.ms 5 分钟),也会触发再 平衡二 Range分区策略
2.1 range分区策略
Range 是对每个 topic 而言的。 首先对同一个 topic 里面的 分区按照序号进行排序 ,并 对 消费者按照字母顺序进行排序 。 假如现在有 7 个分区, 3 个消费者,排序后的分区将会 是0,1,2,3,4,5,6 ;消费者排序完之后将会是 C0,C1,C2 。 例如,7/3 = 2 余 1 ,除不尽,那么 消费者 C0 便会多 消费 1 个分区。 8/3=2 余 2 ,除不尽,那么 C0 和 C1 分别多 消费一个。 通过 partitions 数 /consumer 数 来决定每个消费者应该 消费几个分区。 如果除不尽,那么前面几个消费者将会多 消费 1 个分区。 分区分配策略之 Range 注意: 如果只是针对 1 个 topic 而言, C0 消费者多消费 1 个分区影响不是很大。但是如果有 N 多个 topic ,那么针对每 个 topic ,消费者 C0 都将多消费 1 个分区, topic 越多, C0 消 费的分区会比其他消费者明显多消费 N 个分区。 容易产生数据倾斜!![](https://image.cha138.com/20220414/4fa7f9a3653e41e1b6d01d5732825457.jpg)
2.2 案例分析
1.修改主题 first 为 7 个分区。注意:分区数可以增加,但是不能减少。
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic first --partitions 7 2.复制 CustomConsumer 类,创建 CustomConsumer2。这样可以由三个消费者 CustomConsumer 、 CustomConsumer1 、 CustomConsumer2 组成消费者组,组名都为“ test ”, 同时启动 3 个消费者。 3. 启动 CustomProducer 生产者,发送 500 条消息,随机发送到不同的分区。 说明: Kafka 默认的分区分配策略就是 Range + CooperativeSticky ,所以不需要修改策 略 4. 观看 3 个消费者分别消费哪些分区的数据。 0号消费者![](https://image.cha138.com/20220414/4c63591152d64874b3e092cf3f799a74.jpg)
1号消费者
2号消费者
分析:
2)45s 以后,再次重新发送消息观看结果。
1 号消费者:消费到 0 、 1 、 2 、 3 号分区数据。 2 号消费者:消费到 4 、 5 、 6 号分区数据。 说明:消费者 0 已经被踢出消费者组,所以重新按照 range 方式分配。三 RoundRobin分区策略
3.1 分区策略
RoundRobin 针对集群中 所有 Topic 而言 。 RoundRobin 轮询分区策略,是把 所有的 partition 和所有的 consumer 都列出来 ,然后 按照 hashcode 进行排序 ,最后 通过 轮询算法 来分配 partition 给到各个消费者。![](https://image.cha138.com/20220414/c348a23fe3834a86ab51012308a68360.jpg)
3.2 案例
1.修改之前的3个消费者,消费策略:依次在 CustomConsumer、CustomConsumer1、CustomConsumer2 三个消费者代 码中修改分区分配策略为 RoundRobin。
2.重启 3 个消费者,重复发送消息的步骤,观看分区结果。
消费者0:
消费者1:
消费者2:
分析:
1)停止掉 0 号消费者,快速重新发送消息,然后观看结果(45s 以内,越快越好)。 1 号消费者:消费到 2 、 5 号分区数据 2 号消费者:消费到 3 、6、 0 号分区数据 0 号消费者的任务会 按照 RoundRobin 的方式,把数据轮询分成 1 、4 号分区数据, 分别由 1 号消费者或者 2 号消费者消费。 说明: 0 号消费者挂掉后,消费者组需要按照超时时间 45s 来判断它是否退出,所以需 要等待,时间到了 45s 后,判断它真的退出就会把任务分配给其他 broker 执行 2) 45s 以后,再次重新发送消息观看结果。 1 号消费者:消费到 0 、 2 、 4 、 6 号分区数据 2 号消费者:消费到 1 、 3 、 5 号分区数据 说明:消费者 0 已经被踢出消费者组,所以重新按照 RoundRobin 方式分配。四 Sticky 以及再平衡
4.1 粘性分区
粘性分区定义: 可以理解为分配的结果带有“粘性的”。即在执行一次新的分配之前, 考虑上一次分配的结果,尽量少的调整分配的变动,可以节省大量的开销。 粘性分区是 Kafka 从 0.11.x 版本开始引入这种分配策略, 首先会尽量均衡的放置分区 到消费者上面 ,在出现同一消费者组内消费者出现问题的时候,会 尽量保持原有分配的分 区不变化。4.2 案例
设置主题为 first , 7 个分区;准备 3 个消费者,采用粘性分区策略,并进行消费,观察 消费分配情况。然后再停止其中一个消费者,再次观察消费分配情况 1.修改分区分配策略为粘性。 注意: 3 个消费者都应该注释掉,之后重启 3 个消费者,如果出现报错,全部停止等 会再重启,或者修改为全新的消费者组。![](https://image.cha138.com/20220414/9be7bcaab9504b4d959c6ed399cb0c88.jpg)
![](https://image.cha138.com/20220414/26d192373b4b4cd1aa6ce4cb638471b1.jpg)
1号消费者
2号消费者
分析:
( 1 )停止掉 0 号消费者,快速重新发送消息,然后观看结果(45s 以内,越快越好)。 1 号消费者:消费到 2 、 5 、 3 号分区数据。 2 号消费者:消费到 4 、 6 号分区数据。 0 号消费者的任务会 按照粘性规则,尽可能均衡的随机分成 0 和 1 号分区数据,分别 由 1 号消费者或者 2 号消费者消费。 说明: 0 号消费者挂掉后,消费者组需要按照超时时间 45s 来判断它是否退出,所以需 要等待,时间到了 45s 后,判断它真的退出就会把任务分配给其他 broker 执行。 (2)45s 以后,再次重新发送消息观看结果 。 1 号消费者:消费到 2 、 3 、 5 号分区数据。 2 号消费者:消费到 0 、 1 、 4 、 6 号分区数据。 说明:消费者 0 已经被踢出消费者组,所以重新按照粘性方式分配。
以上是关于kafka 消费者的消费策略以及再平衡的主要内容,如果未能解决你的问题,请参考以下文章
Kafka 消费者之消费方式工作流程消费者案例(订阅主题订阅分区)消费者组案例分区的分配以及再平衡offset 位移消费者事务数据积压(消费者如何提高吞吐量)