任何人都可以解释一下并指导我链接或资源,以了解kafka消费者在以下情况下的工作方式。
一个拥有5个消费者的消费者组和一个具有3个分区的主题(kafka如何决定)
一个拥有5个消费者的消费者组和一个具有10个分区的主题(kafka如何共享负载)
两个消费者组,每个消费者有1个消费者,kafka集群由2个服务器组成,其中一个主题在节点1和节点2之间进行分区,当来自不同组的消费者订阅一个分区时,如何避免重复。
在配置kafka时,上述方法可能不是最佳做法,但我需要了解其处理方式。
谢谢。
答案 0 :(得分:1)
分配分区不是Kafka本身,而是使用者之一。 加入消费者组的第一个将被选为“领导者”,我们将开始为其他消费者分配分区。 当然,每次有新的使用者加入该组时,Kafka的“控制器”就会使主要使用者知道这一点,并开始重新分配重新分配的分区。消费者离开消费者群体时也是一样。
要确认是否涉及到使用者,分区分配策略由使用者配置中的partition.assignment.strategy
属性指定。默认值为RangeAssignor
,而其他值为RoundRobinAssignor
和StickyAssignor
。
您可以在此处找到有关其工作方式的更多信息:
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 :(得分: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。