【问题标题】:How kafka consumer works if consumers are more that partitions如果消费者更多是分区,kafka 消费者如何工作
【发布时间】:2019-08-27 06:03:13
【问题描述】:

任何人都可以解释并指导我链接或资源,以了解 kafka 消费者如何在以下场景中工作。

  1. 一个消费者组有 5 个消费者,主题有 3 个分区(kafka 如何决定)

  2. 一个消费者组有 5 个消费者和主题有 10 个分区(kafka 如何共享负载)

  3. 两个消费者组,每个消费者组和 2 台服务器的 kafka 集群,其中一个主题在节点 1 和节点 2 之间进行分区,当来自不同组的消费者订阅一个分区时如何避免重复。

以上配置 kafka 时可能不是最佳实践,但我需要知道它是如何处理的。

提前致谢。

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    分配分区的不是Kafka本身,而是消费者之一。 第一个加入消费者组的人将被选为“领导者”,我们将开始为其他消费者分配分区。 当然,每次有新的消费者加入组时,Kafka“控制器”都会让领导消费者知道这一点,并开始重新平衡重新分配分区。消费者离开消费者组时也是如此。

    为了确认消费者参与其中,分区分配的策略由消费者配置中的partition.assignment.strategy 属性指定。默认值为RangeAssignor,而其他值为RoundRobinAssignorStickyAssignor。 您可以在此处找到有关它们如何工作的更多信息:

    https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/RangeAssignor.html https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/RoundRobinAssignor.html https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/StickyAssignor.html

    也就是说,在您的场景中具体会发生什么?

    1. 3 个消费者每人将获得一个分区。另外 2 个将处于空闲状态。
    2. 每个消费者将获得 2 个分区
    3. 使用不同的消费者组意味着纯粹的发布/订阅,其中消费者组获得相同的消息。在您有 1 个主题和 2 个分区(在 2 个代理上)的情况下,两个消费者各自在一个不同的消费者组中,将从所有 2 个分区获得相同的消息。如果消费者属于不同的消费者群体,就无法避免重复,这就是 Kafka 的工作方式。

    【讨论】:

    • 感谢 ppatierno 的快速帮助。这真的很有帮助。
    【解决方案2】:

    这取决于partition.assignment.strategy 属性,默认设置为 org.apache.kafka.clients.consumer.RangeAssignor 类。来自 java 文档:

    范围分配器在每个主题的基础上工作。对于每个主题,我们按数字顺序排列可用分区,按字典顺序排列消费者。然后,我们将分区数除以消费者总数,以确定分配给每个消费者的分区数。如果不均匀划分,那么前几个消费者将有一个额外的分区。例如,假设有两个消费者 C0 和 C1,两个主题 t0 ​​和 t1,每个主题有 3 个分区,产生分区 t0p0、t0p1、t0p2、t1p0、t1p1 和 t1p2。分配将是: C0: [t0p0, t0p1, t1p0, t1p1] C1: [t0p2, t1p2]

    您可以通过实现 org.apache.kafka.clients.consumer.internals.PartitionAssignor 来提供自己的策略。 Medium上有一个good article关于它。

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2019-06-10
      • 2016-06-12
      • 2020-08-24
      • 1970-01-01
      相关资源
      最近更新 更多