您当前的位置: 首页 >  kafka

顧棟

暂无认证

  • 3浏览

    0关注

    227博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

kafka 消费者分区分配策略

顧棟 发布时间:2021-06-29 19:37:52 ,浏览量:3

文章目录
  • kafka 消费者分区分配策略
    • 范围分配 RangeAssignor
      • 数据演示
      • 部分源码分析
    • 轮询分配RoundRobinAssignor
      • 数据演示
      • 部分源码分析
    • 粘性分配法 StickyAssignor
      • 数据演示
      • 分配主流程
      • 部分源码分析

kafka 消费者分区分配策略

Note:采用kafka1.1版本源码进行分析

在消费者客户端中有一个参数配置partition.assignment.strategy,是用来配置消费者Client和Topic的分区分配策略,就是指消费者客户端消费订阅的topic的哪些分区,默认值是org.apache.kafka.clients.consumer.RangeAssignor,这是一个默认的分区分配策略。

通过这个类的继承关系,可以发现其父类是一个实现了PartitionAssignor接口的抽象类AbstractPartitionAssignor。这个抽象类目前在1.1版本中一共有3个子类。

  1. RangeAssignor

    范围分配器

  2. RoundRobinAssignor

    轮询分配器

  3. StickyAssignor

    粘性分配器

以上分配器都重写在类AbstractPartitionAssignor中的抽象方法assign,这个方法是分配器具体的分配实现方法。

public abstract Map assign(Map partitionsPerTopic,
                                                         Map subscriptions);
  • 入参
  1. Map partitionsPerTopic

    key:topic

    Value:分区数量(大于0)

  2. Map subscriptions

    key:numberid 消费者组协调器为消费者分配的组成员id,其值是Client与UUID的组合

    val memberId = clientId + "-" + UUID.randomUUID().toString
    

    value;Subscription 消费者订阅了哪些topic和自定义数据

  • 结果
  1. Map assignment

    key:numberid,消费者的组成员id

    Value:List,topic分区对象的列表

    /**
     * 构建出Topic分区对象列表
     *
     * @param topic Topic名称
     * @param numPartitions 分区数量
     * @return List
     */
    protected static List partitions(String topic, int numPartitions) {
        List partitions = new ArrayList(numPartitions);
        for (int i = 0; i             
关注
打赏
1663402667
查看更多评论
0.0426s