kafka生产者:如何在kafka消费者之间(而不是分区之间)公平地平衡消息

zaq34kh6  于 2021-06-04  发布在  Kafka
关注(0)|答案(2)|浏览(306)

我有一个kakfa主题,20个分区和5个conusmers属于同一个消费群体。这意味着每个消费者有4个分区。让我们说:
使用者0被分配给分区0、分区1、分区2和分区3
使用者1被分配到分区4、分区5、分区6和分区7
使用者2被分配到分区8、分区9、分区10和分区11
消费者5被分配到分区12、分区13、分区14和分区15
使用者4被分配到分区16、分区17、分区18和分区19
制作人平均向主题发送10条消息。在这种情况下,只有分区0、1、2、3、4、5、6、7、8和9将接收消息。剩下的将是空的。我们的问题是consumer-0和consumer-1将处理4条消息,同时consumer-2将处理两条消息。而且,使用者4和5将执行任何处理,因为它们的分区是空闲的。
在producer端,我们正在使用defaultpartitioner(kafka客户机2.3.1),以便将记录均匀地发送到分区。我们想问一下,是否有可能公平地基于kafka消费者而不是分区生成消息。通过这种方式,每个使用者将只处理两条消息,并且过程复杂性将在使用者之间公平分配。

mm5n2pyu

mm5n2pyu1#

一般来说,我不认为这是一个好的设计,试图迫使生产者根据消费者来划分数据。Kafka主题应该分离生产者和消费者之间的依赖关系,并将它们彼此封装起来。
不尝试实现这一目标的两个主要原因:
一个Kafka主题意味着要被多个消费群体消费,他们(希望)在消费线程方面彼此独立。
一个消费群体和它的消费者并不稳定,因为他们中的一个可能会死亡,一个重新平衡可能会发生。然后需要有一个粘性分区分配策略,为您的使用者增加更多的复杂性。然而,如果5个消费者中的一个永远死去呢?您将无法读取其四个分区的消息。请记住,消费群体是一个“移动的东西”,我建议让Kafka尽可能多地处理它。
我知道这可能无法回答你的问题。如果您想要适当的平衡,您应该将分区的数量与使用者线程相匹配,并确保在生产者端,所有消息都是以平衡的方式跨分区生成的。
记住,即使在使用 DefaultPartitioner 当主题多达20个时,仍然会产生不平衡的数据,因为这取决于密钥的哈希值。

hpxqektj

hpxqektj2#

我认为您所做的计算是不相关的,因为没有场景只有10条消息将被发送,如果这是真的情况,您应该考虑使用较少的分区和消费群体中相对较少的消费者。
您可以假设,对于流中的大量记录,您的生产者将在分区之间以及使用者之间大致平均地分配负载,现在您不必关心使用者1是否收到1000条记录,使用者2是否收到998条记录。
还要记住,如果负载在变化,对于较低的阶段,你不会让消费者空闲,而是处理相同的负载,这是完全可以的,一些消费者得到4条消息,其他2条,其他0条,因为处理4条消息基本上是一种“空闲”相对于你所期望的负载,而这些差异是如此之小,他们并不真正计算;因此,让Kafka在处理能力/时间真正重要的时候为更高的负载施展魔法。

相关问题