多个Kafka生产者对同一主题进行编写--如何平衡负载消耗?

问题描述 投票:0回答:1

所以我有一个设计,我有多个生产者P1,P2,P3,P4......。PN写到一个主题T1,有32个分区。

在另一边,我有多达32个消费者在一个消费者组。

我想平衡我的消息消耗。阅读文档,我可以看到3个选项。 1. 自己定义分区(缺点是我必须知道最后一条消息的发送地点,或者为每个生产者P定义一个分区范围) 2. 定义一个密钥,然后把分区的决定权留给Kafka哈希算法(缺点--负载均衡将根据运气来定义)(根据Chris的回答,负载均衡应该留给哈希算法)--现实情况表明,这并不能为消费者提供平等的分配,因为消费者被绑定到分区上,而且我必须了解哈希算法来选择一个好的密钥--在我看来,这听起来和选择分区是一样的(而且这必须分配给生产者)我目前的代码是使用UUID作为密钥。通过对所选分区的分析,进而分析消费者的工作情况,发现其分布可能远远不对等。我在下面转载。

Messages received by partition上图显示了在5分钟的窗口中,每个分区收到的消息数量,使用UUID作为我的密钥--在那个时间点上,我有8个消费者.消耗大约需要2分钟. 红色的单元格显示了其中一个消费者的9个请求队列,而其他消费者的负载很低--或者像绿色的消费者一样是零负载.如果随机密钥不是一个好的选择,我应该选择什么?

  1. 没有分区,没有密钥,留给Kafka round robin算法(缺点是round robin是Producer内部的--意味着所有的producer都可能向同一个分区发送消息--我也测试了这个选项,结果如下。

round robin is internal to producer上图显示round robin显然是生产者内部的。

我真的需要自己编写整体的负载均衡算法吗?我是不是遗漏了什么?

apache-kafka kafka-consumer-api kafka-producer-api
1个回答
0
投票

在消费者之间平衡负载是Kafka的定义特性之一,它允许水平扩展。

生产者使用的记录密钥是允许这个工作的原因。密钥定义了消息进入哪个分区,任何分区都会被一个消费者依次消费,因此你的生产者应该使用一个密钥策略,产生一个均匀的传播,并确保相关的消息具有相同的密钥,如果排序是重要的(请记住,如果严格的排序是关键的,还有其他考虑因素围绕在飞行请求)。

前者是平衡负载的方法--消费者中不涉及轮回,分区只是在每个组的消费者中尽可能均匀地共享出去,它们独立地进行轮询。如果密钥分布良好,那么每个分区的记录数量就会差不多。

所以,为了实现有效的负载均衡,你唯一的责任就是使用一个好的策略来创建消息密钥,并定义你的主题,至少要有与你计划扩大消费规模一样多的分区。

© www.soinside.com 2019 - 2024. All rights reserved.