如果消费者更多是分区,kafka 消费者如何工作

Posted

技术标签:

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

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

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

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

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

以上配置 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

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

    3 个消费者每人将获得一个分区。另外 2 个将处于空闲状态。 每个消费者将获得 2 个分区 使用不同的消费者组意味着纯粹的发布/订阅,其中消费者组获得相同的消息。在您有 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关于它。

【讨论】:

以上是关于如果消费者更多是分区,kafka 消费者如何工作的主要内容,如果未能解决你的问题,请参考以下文章

Apache Kafka 是不是适合用作无序任务队列?

如何获取 kafka 主题分区的最后/结束偏移量?

kafka如何平衡分区负载?

Kafka 消费者之消费方式工作流程消费者案例(订阅主题订阅分区)消费者组案例分区的分配以及再平衡offset 位移消费者事务数据积压(消费者如何提高吞吐量)

kafka kafka如何设置指定分区进行发送和消费

kafka消费者java版本读取不到消息怎么办