【发布时间】:2017-03-25 18:32:51
【问题描述】:
我遇到了一个关于 kafka 负载平衡的问题。所以,我创建了一个有 10 个分区的主题并创建了 2 个消费者。 10 个分区被划分并分配给这些消费者(第一个分区 5 个,第二个分区 5 个),它工作正常。有时第一个消费者工作,有时第二个。
但是在某一时刻,我们可能会遇到这样一种情况,例如第二个消费者收到一条消息,并且需要时间(例如 10 分钟)来处理这条消息。
那么,我的问题是 kafka 将如何决定将消息存储到哪个分区?
我认为在这种情况下轮询不是一个好主意,因为在第二个消费者完成长时间工作之前,不会处理由第二个消费者处理的分区中的消息。
更新!
根据@Milan Baran 的回答,负载在生产者端是平衡的。但是在这种情况下,即使我们提供了一个自定义的Partitioner 实现,同样的问题是存储在分区中的消息被分配给正在做长期工作的消费者,直到这个消费者完成了它的长期工作。
可能,其他地方还有额外的负载均衡器?
【问题讨论】:
-
你为什么不运行更多的消费者?如果您启动 10 个消费者,那么当一个消费者长时间忙碌时,您还有 9 个消费者在处理其他 9 个分区中的数据。
-
但是10的分区中的所有消息直到忙时才被处理。这就是问题
-
能否编写一个自定义分区器,将长时间运行的消息放入一个专用分区,以便所有小的消息都可以分区并在剩余的分区中处理?
标签: java performance apache-kafka load-balancing partition