Apache kafka Kafka消费群的次优划分

Apache kafka Kafka消费群的次优划分,apache-kafka,kafka-consumer-api,kafka-python,Apache Kafka,Kafka Consumer Api,Kafka Python,我在与卡夫卡消费者合作时遇到了一个特殊的问题。当我有一个包含多个分区的主题,以及一个消费者组时,如果消费者数量小于分区数量,消费最终会变得不平衡。例如,如果我有8个分区和4个使用者,我会看到如下情况: Client Partition Lag C1 P0 1000000 C1 P1 1000000 C2 P2 0 C2 P3 0 C3 P4 1000000 C3 P5

我在与卡夫卡消费者合作时遇到了一个特殊的问题。当我有一个包含多个分区的主题,以及一个消费者组时,如果消费者数量小于分区数量,消费最终会变得不平衡。例如,如果我有8个分区和4个使用者,我会看到如下情况:

Client Partition Lag
C1     P0        1000000
C1     P1        1000000
C2     P2        0
C2     P3        0
C3     P4        1000000
C3     P5        1000000
C4     P6        0
C4     P7        0
因此,有些客户零延迟,什么也不做,有些客户大延迟,努力工作,但被甩在了后面。请注意,我当然可以有8个客户机,但考虑到我不需要8个客户机的工作负载,我只需要4个客户机,只是Kafka分配分区的方式实际上四个客户机中只有两个可以工作。我也可以手动分配分区,但这会使应用程序逻辑复杂很多,我很高兴使用Kafka消费群体功能,除了这个恼人的平衡问题


因此,我想知道是否有任何方法可以自动对此进行调整,即以某种方式重新分配客户,使其能够平均分配工作。我知道有一次,但似乎什么都没有发生。所以我想知道是否有任何方法可以在现有的条件下自动完成。我现在使用的是
kafka-python
驱动程序,因此理想情况下,该解决方案可以在python中实现,而无需将所有系统移动到Java

不幸的是,没有办法保证绝对平衡,您需要为消费者组中的每个消费者手动配置分区分配

如果您使用的是kafka python驱动程序,它可能类似于下面的示例

>>> # manually assign the partition list for the consumer
>>> from kafka import TopicPartition
>>> consumer = KafkaConsumer(bootstrap_servers='localhost:1234')
>>> consumer.assign([TopicPartition('foobar', 2)])
>>> msg = next(consumer)
有关更多信息,请参阅此处的链接:

第二个链接很好地概述了不同的分区分配策略,但请注意示例是用Java编写的:


希望这有帮助,如果你需要更多的细节,请评论

我并不是在寻找绝对的平等,但有些消费者无所事事地坐了几个小时,而其他人却在处理双倍的工作量,再多的再平衡也帮不上什么忙,这是很荒谬的。当然,我可以手动管理分区,但使用Kafka的全部目的是为了避免我这样做。。。也许我得写我自己的转让人。我希望有些东西已经存在…让我们期待未来的版本吧!我看到很多博客都在评论这个问题。我认为Jeppe Andersen的解释很好: