【发布时间】:2020-05-24 17:03:37
【问题描述】:
所以我有一个设计,我有多个生产者 P1、P2、P3、P4 ... PN 写入具有 32 个分区的单个主题 T1。
另一方面,我在一个消费者组中最多有 32 个消费者。
我想对我的消息消耗进行负载平衡。
阅读文档我可以看到 3 个选项:
1.自己定义分区(缺点我必须知道最后一条消息发送到哪里或者为每个Producer P定义一个分区范围)
2. 定义一个键并将分区决策留给 Kafka 哈希算法(缺点 - 负载平衡将根据运气定义)
(根据 Chris 的回答,负载平衡应该留给哈希算法)-现实表明这并没有为消费者提供平等的分配,因为消费者绑定到分区,我必须了解哈希算法才能选择一个好的密钥——对我来说这听起来与选择分区相同(并且必须分配超过生产者)
我当前的代码使用 UUID 作为键。对所选分区以及消费者工作的分析表明,分布可能远非相等。我在下面复制它:
上图显示了使用 UUID 作为我的键的 5 分钟窗口内每个分区接收到的消息数量——当时我有 8 个消费者。 消耗大约需要2分钟。红色的单元格显示其中一个消费者中有 9 个请求队列,而其他消费者的负载较低 - 或像绿色消费者一样为零负载。 如果随机密钥不是一个好的选择,我应该选择什么?
- 没有分区,没有密钥,留给 Kafka 循环算法(缺点循环是生产者内部的 - 这意味着所有生产者都可以将消息发送到同一个分区 - 我也测试了这个选项,结果如下:
我真的需要自己编写整体负载均衡算法吗?我错过了什么吗?
【问题讨论】:
标签: apache-kafka kafka-consumer-api kafka-producer-api