Kafka - Kafka 消费者 + 再平衡Rebalance

回到顶部(go to top)

一、kafka消费方式

kafka采取pull(拉)模式

 

 

回到顶部(go to top)

二、消费者总体工作流程

老版本0.9之前,offset保存在zookeeper上。

新版本1.0后,每个消费者的offset又消费者提交到系统主题保存。

 

 

回到顶部(go to top)

三、消费者组原理

3.1 原理简介

 

 

 

 

3.2 消费者组初始化过程

 

 

回到顶部(go to top)

四、消费者API

4.1 独立消费者案例

1)消费者消费某主题 - subscribe()

 

 

 

代码示例:

 

 

 

 

2)消费者消费某主题的特定分区 - assign()

下图,展示该消费者,消费first主题,指定的0号分区

 

 

4.2 消费者组案例

 

 

三个消费者,都是在test消费者组中

 

 

回到顶部(go to top)

五、分区分配策略 + 再平衡

请参加更佳详细专业的博客:【kafka】Kafka消费者分区分配策略详解

 

以下截图是B站讲解,讲了个大概,不详细。

  

5.1 Range策略 - 针对每个topic

正常情况

 

 

 

再平衡策略

前提:session.timeout.ms = 45, 一旦消费者和coordinators失去联系超过45s,该消费者就会下线

情况1:当消费者0突然下线,但还没超时45s 时,且此时发送者又发送了数据。此时分区0,1,2的数据无法抵达消费者0,也不会去消费者consumer 1,consumer 2。但等过了45s后,0,1,2分区的数据会全部涌进消费者consumer 1里。

情况2:当消费者0下线超过45s,会被下线。消费者只剩下consumer 1,consumer 2. 如果此时发送者发送数据,这时剩下的两个消费者会重新划分分区:consumer 1 接受 0,1,2,3;consumer 2 接受 4,5,6 。

 

5.2 RoundRobin策略 - 针对所有topic

 

 

 

正常情况

 

 

 

 

 

再平衡策略

情况1:当消费者1突然下线,但还没超时45s 时,且此时发送者又发送了数据。此时分区0,3,6的数据无法抵达消费者0, 也不会去消费者consumer 2,consumer 3。但等过了45s后,0,3,6这三个分区依然遵循轮询的办法,把0,6分区放进其中一个consumer,3分区去另一个consumer。

情况2:当消费者1下线超过45s,会被下线。消费者只剩下consumer 2,consumer 3. 如果此时发送者发送数据,这时剩下的两个消费者会重新划分分区:consumer 2 接受 0,2,4,6;consumer 3 接受 1,3,5 。

 

5.3 Sticky策略

所以如果使用默认的轮询partition策略,可能会造成一个大的batch被轮询成多个小的batch的情况,鉴于小batch可能导致延时增加。鉴于此,kafka2.4的时候推出一种新的分区策略,即StickyPartitioning Strategy,StickyPartitioning Strategy会随机地选择另一个分区并会尽可能地坚持使用该分区——即所谓的粘住这个分区。该策略是一种全新的策略,能够显著地降低给消息指定分区过程中的延时。使用StickyPartitioner有助于改进消息批处理,减少延迟,并减少broker的负载。

 

分区的分配要尽可能的均匀,分配给消费者者的主题分区数最多相差一个;

分区的分配尽可能的与上次分配的保持相同。

 

可以看到,虽然range和sticky都是分成了三组3-2-2组合,但是range是先排序再分组,而sticky是随机的

 

 

 

再平衡策略

情况1:当消费者1突然下线,但还没超时45s 时,且此时发送者又发送了数据。45s内没反应。但等过了45s后,会把下线消费者原本负责的分区,均匀随机分给其他消费者。

情况2:当消费者1下线超过45s,会被下线。消费者只剩下consumer 2,consumer 3. 如果此时发送者发送数据,...会把所有的分区,重新均匀随机分给存活的消费者。

 

可以看到,情况2重新分配时,consumer 0 依然保持着原来的1,4分区;consumer2 依然保留 2,5分区...黏上了!

 

 

 

 

 

5.4 CooperativeSticky 策略 - 再平衡时不必放弃原有分区

 

 

 

 

 

 

 

回到顶部(go to top)

六、offset位移

6.1 offset的默认维护位置?

kafka 0.9版本之前,offset保存在zookeeper里。

kafka 0.9版本开始,offset默认保存在一个系统主题_consumer_offsets里面。

 

 

 

 

 

 

如何查看系统主题consumer_offsets呢?

默认情况下,是不能查看的。

 

 

 

6.2 自动提交offset

 

 

 

 

 

6.3 手动提交offset

自动提交offset虽然方便,但是可能出现提前消费的情况 -- 即消费者已经消费到5号了,但是offset保存的还是2号,因为还没到5s,所以还未更新offset。

 

 

 

 

 

 

6.4 指定offset消费

 

 

 

红色框注意:得等3.2小节的示意图1-6步骤完成,才能拿到分区情况:

 

 

 

 

 

6.5 指定时间消费

 

 

 

6.6 漏消费 与 重复消费

 

 

如何解决该问题,实现“精准一次性消费”? -- 消费者事务

详细内容之后再讲。

 

 

6.7 数据积压(kafka集群 -- 消费者端

生产者端 -- kafka集群

参考之前文章:https://www.cnblogs.com/frankcui/p/16065365.html#_label4

 

kafka集群 -- 消费者端 

方法2要注意kafka默认每批次最大50M,如果修改消费者一次拉去条数后超过了50M,要记得去修改50M这个配置

 

posted on   frank_cui  阅读(148)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示