kafka consumer相关文档阅读

This commit is contained in:
2023-11-19 01:29:28 +08:00
parent 7e1b790441
commit 828b7848cc

View File

@@ -27,6 +27,13 @@ kafka将一个topic分为了多个分区用于分布式存储数据。而每
>
> 在一个consume group中每个消费者实例都负责某一topic中相应的分区每个特定分区只有一个消费者实例负责。
> #### 消费者订阅
> 消费者的订阅操作是在消费者实例中调用的,在同一消费者组中,**不同消费者实例可以订阅不同的topic集合**。topic的分区只会在订阅了该topic的实例之间进行分配。
>
> 例如存在消费者实例c1,c2,c3, 其中c1订阅了t1c2订阅了t1和t2c3订阅了t1, t2, t3, 那么t1的分区将会在c1, c2, c3之间进行发呢配t2的分区只会在c2和c3之间进行分配t3的分区只会被分配给c3
#### zookeeper
zookeeper作为注册中心用于记录存在多个kafka实例时当前已上线且状态正常的kafka实例以及各个分区leader实例的信息
@@ -325,5 +332,39 @@ kafka采用的是拉取模式来进行消费因为拉取模式可以很好的
> poll方法调用在没有可用的消息集合时会发送fetch请求从broker拉取数据
##### 分区分配和再平衡
一个消费者组中含有多个消费者实例而一个topic会包含多个分区需要将topic中的分区在消费者组中的多个消费者实例之间进行分配。
kafka中包含如下分区策略
- range
- RoundRobin
- Sticky
- CooperativeSticky
kafka中的分区策略通过`partition.assignment.strategy`参数来进行配置kafka可以通过使用多个分区分配策略多个策略会进行叠加。默认情况下kafka采用`Range + CooperativeSticky`的策略来进行分区分配。
> #### Range策略及再平衡
> range策略会针对每个topic进行分配。如果一个topic中含有n个分区消费者组中含有m个消费者实例那么每个消费者实例将会分配到n/m整除个分区多出来的n%m个分区将会被分配给实例名称靠前的n%m个实例。
>
> range策略将会有如下弊端如果每个topic都无法对消费者实例整除那么剩余的分区都会被分配给排序靠前的消费者实例这样会造成分区在消费者实例之间分配的不平衡排序靠前的消费者实例会负担更多的分区
>
> 在使用range策略时如果某台消费者实例宕机那么在宕机超过限定时间45s内没有向broker coordinator发送心跳包会将topic分区重新在消费组中的剩余实例之间进行再分配完全重新生成分配方案排序靠前的消费者实例在分区数量无法整除实例个数时负担更多的分区消费
> #### RoundRobin
> RoundRobin策略针对所有消费者组订阅的所有topic中的分区会将所有分区根据hashcode进行排序并且按轮询的顺序分配给消费者实例。例如第一个分区分配给第一个消费者实例第二个分区分配给第二个实例...第m+1个分区再次分配给第一个实例实例总数为m。RoundRobin将所有分区在所有消费者实例之间进行了平衡而不像range一样只是针对单个topic中的分区。
>
> 在使用RoundRobin策略时如果消费者中某一实例宕机超过超时时间后分区同样会在剩余的消费者实例之间进行重新分配。
> #### Sticky
> Sticky策略同样是针对所有topic的分区类似于RoundRobin。但是不同于RoundRobin的轮询Sticky在分配策略时会遵循如下原则
> - Sticky策略会尽可能均匀的在不同消费者实例之间分配分区
> - 如果因为某些原因例如实例宕机导致需要进行分区的重新分配Sticky会尽可能的保证存活实例上已经产生的分区分配不被改变并再次基础上令所有分区在实例间的分配尽量均衡
>
> 在使用Sticky策略时即使某台实例宕机再平衡后存活实例被分配的分区仍然不会变只是会将宕机实例负责的分区在存活实例之间尽可能均衡的分配