如何解决卡夫卡生产者:如何在卡夫卡使用者之间而不是分区之间公平地平衡消息
我有一个kakfa主题,其中有20个分区和5个使用者属于同一个消费群体。这意味着每个使用者有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会接收消息。其余的将为空。 我们的问题是消费者0和消费者1将处理4条消息,而消费者2将同时处理两条消息。而且,消费者4和5将进行任何处理,因为它们的分区处于空闲状态。
在生产者端,我们正在使用DefaultPartitioner(kafka客户端2.3.1),以便将记录均匀地发送到分区。我们想问问是否有可能公平地基于kafka使用者而不是分区来产生消息。通过这种方式,每个使用者将仅处理两条消息,并且在使用者之间公平地分配过程复杂性。
解决方法
我认为您所做的计算是无关紧要的,因为在任何情况下都不会发送10条消息,如果确实是这种情况,则应考虑在消费者组中使用较少的分区和相对较少的消费者。
您可以假设,对于流中的大量记录,生产者将在分区之间(因此在消费者之间)大致平均分配负载,现在您不在乎消费者1是否收到1000条记录,消费者2收到998。
还请记住,如果负载在变化,并且对于较低的阶段,您不会让使用者不处于空闲状态而是要处理相同的负载,这完全可以,有些使用者会收到4条消息,其他的会收到2条消息0,因为相对于您期望的负载而言,处理4条消息基本上是“闲置”,并且这些差异非常小,因此实际上并没有计算在内; 因此,当处理能力/时间真的很重要时,让卡夫卡为更高的负载发挥作用。
,通常,我认为这不是一个很好的设计,试图迫使生产者根据消费者对数据进行分区。 Kafka主题应将生产者和消费者之间的依赖性分开,并将它们相互封装。
不尝试实现此目标的两个主要原因:
- 一个Kafka主题旨在由多个消费者群体消费,并且(希望)它们在消费者线程方面彼此独立。 消费者群及其消费者不稳定,因为其中一个人可能死亡并可能发生再平衡。然后,需要具有粘性分区分配策略,该策略可为用户增加更多的复杂性。但是,如果五个消费者之一永远死亡怎么办?您将无法读取其四个分区的消息。记住,消费群体是一件“动人的事”,我建议让卡夫卡尽可能多地讨价还价。
我了解这可能实际上无法回答您的问题。如果要进行适当的平衡,则应使分区数与使用者线程匹配,并在生产者端确保所有消息均以均衡的方式遍历所有分区。
请记住,即使使用DefaultPartitioner
具有多达20个主题,您仍然可能最终产生不平衡的数据,因为它取决于密钥的哈希值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。