多个Kafka生产者正在写同一主题-如何负载均衡消耗

时间:2020-05-20 18:38:29

标签: apache-kafka kafka-consumer-api kafka-producer-api

所以我有一个设计,其中有多个生产者P1,P2,P3,P4 ... PN写入具有32个分区的单个主题T1。

另一方面,在一个消费者群体中,我最多有32个消费者。

我想平衡邮件的使用量。

阅读文档,我可以看到3个选项:
1.自己定义分区(缺点是我必须知道最后一条消息的发送位置或为每个生产者P定义一个分区范围)
2.定义一个密钥,并将分区决策留给Kafka哈希算法(缺点-运气将定义负载平衡)

(根据Chris的回答,负载平衡应留给哈希算法)-现实表明,由于消费者绑定到分区,因此不能为消费者提供均匀的分配,我必须了解哈希算法才能选择一个好的密钥-在我看来,这与选择分区是一样的(而且必须

我当前的代码是使用UUID作为密钥。对所选分区的分析以及由此引起的消费者工作表明,分布可能远非相等。我在下面复制它:

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

  1. 没有分区,没有密钥,并留给Kafka循环算法(回退是生产者内部的循环-意味着所有生产者都可以将消息发送到同一分区-我也测试了此选项,结果如下:

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

我真的需要自己编写总体负载平衡算法吗?我想念什么吗?

1 个答案:

答案 0 :(得分:0)

在使用者之间平衡负载是Kafka的一项定义功能,它允许水平扩展。

生产者使用的记录密钥使它可以工作。该密钥定义了消息继续运行的分区,并且一个消费者将按顺序使用任何分区,因此您的生产者应使用密钥策略,该策略可以产生均匀的传播,并确保相关的消息具有相同的密钥(如果订购很重要的话)(熊请注意,如果要求严格订购,则在飞行请求中还需要考虑其他因素。

前者是平衡负载的角色-消费者之间没有循环机制,只是在每个组中的消费者之间尽可能均匀地共享分区,并且它们独立进行轮询。如果密钥分布合理,则每个分区将具有大约相同数量的记录。

因此,要实现有效的负载平衡,您唯一的责任就是使用一种良好的策略来创建消息密钥,并使用计划扩展到至少要使用的分区来定义主题。