详解Kafka分区分配策略

前言:

一个consumer group中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个partition由哪个consumer来消费。

Kafka有两种分配策略,一是RoundRobin,二是Range

1. RoundRobin

RoundRobin意为“轮循”,假设有一个消费者组,里面有A和B两个消费者。A和B同时订阅了topic T1 和 T2,topic T1 和 T2分别有3个分区,由于一个分区只能由一个消费者消费,那A和B应该分别消费那个主题的那个分区呢?

1.1 RoundRobin的分配方式
  • 1)首先RoundRobin会对两个topic里面的分区进行排序,规则是按照 topic名+分区数 的哈希值进行排序。
  • 2)排序后,会将所以分区逐个分给不同的消费者。假设排好的顺序为 T1-0、T2-0、T1-1、T1-2,T2-1、T2-2,那么T1-0就会分给消费者A,然后T2-0分给消费者B,T1-1再分给A…以此类推,直到把所有的分区分配完。
1.2 RoundRobin分配再说明

假设上面topic T1 和 T2的分区总共有五个,那么结果就是A会比B多消费一个分区或者B比A多消费一个分区,所以RoundRobin这种分配方式最多会导致消费者消费的分区数相差一个。

这种分配方式某些情况下可能适合:

假设有两个topic T1、T2,每个topic都有三个分区,然后A订阅了topic T1,B订阅了topic T2。可是RoundRobin是按照组来分配的,它依然会先将所有分区排序,然后逐个分给A和B两个消费者,这可能就会导致T2的分区分给了A,而T1的分区分给了B。可是A没有订阅T2,B也没有订阅T1,所以逻辑混乱。

结论:要想使用RoundRobin分配方式要保证一个消费者组内的所有消费者订阅的是相同的topic。

2. Range

Range意为“范围”,是Kafka默认的分配方式。假设有一个消费者组,里面有A和B两个消费者。A和B同时订阅了topic T1 和 T2,topic T1 和 T2分别有3个分区,由于一个分区只能由一个消费者消费,那A和B应该分别消费那个主题的那个分区呢?

2.1 Range的分配方式
  • 1)Range是按主题分配的。 首先拿topic T1的分区数模以消费者组里面的订阅了它的消费者个数,T1里面有3个分区模以A和B两个消费者无法模尽(3 % 2 = 1),所以 T1-0 和 T1-1两个分区就会分给A,而T1-2分区就会分给B。
  • 2)topic T2的分区分配和T1一样。
2.2 Range分配方式的再说明

上面的例子的分配结果是A负责有四个分区而B只负责有两个分区,A和B负责分区相差两个,随着订阅的topic增多A和B负责的分区数相差会越来越大。 但是如果A只订阅了T1,B只订阅了T2,那么T1的分区都会分给A而T2的分区都会分给B,就不会出现RoundRobin里面的那种逻辑混乱。

3. 分配方式的触发条件

当消费者组增加或减少消费者时就会触发分配机制进行重新分配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值