articleList

14-Kafka的Consumer消费者机制和分区策略讲解

2025/03/13 posted in  Kafka
Tags: 

  • 消费者根据什么模式从broker获取数据的?

    • 为什么是pull模式,而不是broker主动push?
      • 消费者采用 pull 拉取方式,从broker的partition获取数据
      • pull 模式则可以根据 consumer 的消费能力进行自己调整,不同的消费者性能不一样
        • 如果broker没有数据,consumer可以配置 timeout 时间,阻塞等待一段时间之后再返回
      • 如果是broker主动push,优点是可以快速处理消息,但是容易造成消费者处理不过来,消息堆积和延迟
  • 消费者从哪个分区进行消费?

    • 一个 topic 有多个 partition,一个消费者组里面有多个消费者,那是怎么分配过
      • 一个主题topic可以有多个消费者,因为里面有多个partition分区 ( leader分区)
      • 一个partition leader可以由一个消费者组中的一个消费者进行消费
      • 一个 topic 有多个 partition,所以有多个partition leader,给多个消费者消费,那分配策略如何?
  • 消费者从哪个分区进行消费?两个策略

    • 顶层接口
org.apache.kafka.clients.consumer.internals.AbstractPartitionAssignor
  • round-robin (RoundRobinAssignor非默认策略)轮询

    • 【按照消费者组】进行轮训分配,同个消费者组监听不同主题也一样,是把所有的 partition 和所有的 consumer 都列出来, 所以消费者组里面订阅的主题是一样的才行,主题不一样则会出现分配不均问题,例如7个分区,同组内2个消费者
      • topic-p0/topic-p1/topic-p2/topic-p3/topic-p4/topic-p5/topic-p6
      • c-1: topic-p0/topic-p2/topic-p4/topic-p6
      • c-2:topic-p1/topic-p3/topic-p5
    • 弊端
      • 如果同一消费者组内,所订阅的消息是不相同的,在执行分区分配的时候不是轮询分配,可能会导致分区分配的不均匀
      • 有3个消费者C0、C1和C2,他们共订阅了 3 个主题:t0、t1 和 t2
      • t0有1个分区(p0),t1有2个分区(p0、p1),t2有3个分区(p0、p1、p2))
      • 消费者C0订阅的是主题t0,消费者C1订阅的是主题t0和t1,消费者C2订阅的是主题t0、t1和t2
        image-20210506135744478
  • range (RangeAssignor默认策略)范围

    • 【按照主题】进行分配,如果不平均分配,则第一个消费者会分配比较多分区, 一个消费者监听不同主题也不影响,例如7个分区,同组内2个消费者
      • topic-p0/topic-p1/topic-p2/topic-p3/topic-p4/topic-p5//topic-p6
      • c-1: topic-p0/topic-p1/topic-p2/topic-p3
      • c-2:topic-p4/topic-p5/topic-p6
    • 弊端
      • 只是针对 1 个 topic 而言,c-1多消费一个分区影响不大
      • 如果有 N 多个 topic,那么针对每个 topic,消费者 C-1 都将多消费 1 个分区,topic越多则消费的分区也越多,则性能有所下降