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

时间:2019-04-05 10:39:34

标签: apache-kafka

任何人都可以解释一下并指导我链接或资源,以了解kafka消费者在以下情况下的工作方式。

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

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

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

在配置kafka时,上述方法可能不是最佳做法,但我需要了解其处理方式。

谢谢。

2 个答案:

答案 0 :(得分: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个分区
  3. 使用不同的消费群体表示纯pub / sub,其中消费群体获得相同的消息。在您有1个主题和2个分区(在2个代理上)的情况下,两个使用者分别位于一个不同的使用者组中,将从所有2个分区中获得相同的消息。如果消费者是不同消费者群体的一部分,那么您就无法避免重复,这就是Kafka的运作方式。

答案 1 :(得分:0)

这取决于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