CC00057.kafka——|Hadoop&kafka.V42|——|kafka.v42|分区分配策略.v01|

一、分区分配策略
### --- 分区分配策略

~~~     在Kafka中,每个Topic会包含多个分区,
~~~     默认情况下一个分区只能被一个消费组下面的一个消费者消费,这里就产生了分区分配的问题。
~~~     Kafka中提供了多重分区分配算法(PartitionAssignor)的实现:
~~~     RangeAssignor、RoundRobinAssignor、StickyAssignor。
二、多重分区分配算法:RangeAssignor
### --- RangeAssignor

~~~     PartitionAssignor接口用于用户定义实现分区分配算法,以实现Consumer之间的分区分配。
~~~     消费组的成员订阅它们感兴趣的Topic并将这种订阅关系传递给作为订阅组协调者的Broker。
~~~     协调者选择其中的一个消费者来执行这个消费组的分区分配并将分配结果转发给消费组内所有的消费者。
~~~     # Kafka默认采用RangeAssignor的分配算法。

~~~     RangeAssignor对每个Topic进行独立的分区分配。
~~~     对于每一个Topic,首先对分区按照分区ID进行数值排序,
~~~     然后订阅这个Topic的消费组的消费者再进行字典排序,之后尽量均衡的将分区分配给消费者。
~~~     这里只能是尽量均衡因为分区数可能无法被消费者数量整除,那么有一些消费者就会多分配到一些分区。
### --- 大致算法如下:

assign(topic, consumers) {
    // 对分区和Consumer进行排序
    List<Partition> partitions = topic.getPartitions();
    sort(partitions);
    sort(consumers);
    
    // 计算每个Consumer分配的分区数
    int numPartitionsPerConsumer = partition.size() / consumers.size();
    // 额外有一些Consumer会多分配到分区
    int consumersWithExtraPartition = partition.size() % consumers.size();
    // 计算分配结果
    for (int i = 0, n = consumers.size(); i < n; i++) {
        // 第i个Consumer分配到的分区的index
        int start = numPartitionsPerConsumer * i + Math.min(i,consumersWithExtraPartition);
        // 第i个Consumer分配到的分区数
        int length = numPartitionsPerConsumer + (i + 1 > consumersWithExtraPartition ? 0 : 1);
        // 分装分配结果
        assignment.get(consumersForTopic.get(i)).addAll(partitions.subList(start,start + length));
    }
}
~~~     RangeAssignor策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,
~~~     然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。
~~~     对于每一个TopicRangeAssignor策略会将消费组内所有订阅这个Topic的消费者按照名称的字典序排序,
~~~     然后为每个消费者划分固定的分区范围如果不够平均分配那么字典序靠前的消费者会被多分配一个分区。
~~~     这种分配方式明显的一个问题是随着消费者订阅的Topic的数量的增加,不
~~~     均衡的问题会越来越严重,比如上图中4个分区3个消费者的场景,C0会多分配一个分区。
~~~     如果此时再订阅一个分区数为4的Topic,那么C0又会比C1、C2多分配一个分区,
~~~     这样C0总共就比C1、C2多分配两个分区了,而且随着Topic的增加,这个情况会越来越严重。
三、字典序靠前的消费组中的消费者比较“贪婪”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值