我在与Kafka消费者合作时遇到了一个特殊的问题。当我有一个包含多个分区和一个消费者组的主题时,如果消费者号小于分区号,则消费最终将变得不平衡。例如,如果我有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分配分区的方式实际上只有4个可以工作。我也可以手动分配分区,但这会使应用程序逻辑复杂化,除了这个令人讨厌的平衡问题之外,我对使用Kafka使用者组功能感到非常满意。
所以,我想知道是否有任何方法可以自动调整这一点-即以某种方式将客户重新分配,以使其能够平均分配工作。我知道这里有一个proposal for something like that,但似乎没有任何反应。因此,我想知道是否有任何方法可以在现有手段下自动完成。我现在正在使用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)
查看链接以了解更多:https://kafka-python.readthedocs.io/en/master/
此第二个链接很好地概述了不同的分区分配策略,但是请注意,这些示例均使用Java:https://medium.com/streamthoughts/understanding-kafka-partition-assignment-strategies-and-how-to-write-your-own-custom-assignor-ebeda1fc06f3
希望有帮助,如果您需要更多详细信息,请发表评论!