kafka如何平衡分区加载?

D. *_*nka 7 java performance load-balancing apache-kafka partition

我在卡夫卡遇到了负载均衡的问题.所以,我创建了一个包含10个分区的主题并创建了2个消费者.这10个分区被划分并分配给这些消费者(第一个分区为5个分区,第二个分区为5分区),并且工作正常.有时第一个消费者工作,有时第二.

但是,在某一时刻,我们可能面临一种情况,例如第二个消费者收到消息并且需要时间(例如10分钟)来处理此消息.

那么,我的问题是kafka将如何决定将消息存储在哪个分区中?

在这种情况下循环我认为不是一个好主意,因为在第二个消费者完成长时间工作之前,将不会处理由第二个消费者处理的分区中的消息.

更新!

根据@Milan Baran的回答,负载在生产者方面是平衡的.但是在这种情况下,即使我们提供自定义Partitioner实现,在分配给分配给正在进行长期工作的消费者的分区中的消息也将是同样的问题,直到此消费者完成为止它的长期工作.

可能是,其他地方还有额外的负载均衡器?

Mil*_*ran 5

应该使用哪个分区的决定不是由 kafka 决定的,而是由发送消息的生产者决定。看https://kafka.apache.org/documentation#producerconfigs

您可以提供一个分区程序类来决定选择哪个分区。

partitioner.class
实现 Partitioner 接口的 Partitioner 类。 org.apache.kafka.clients.producer.internals.DefaultPartitioner

有对 DefaultPartitioner 策略的描述

/**
 * The default partitioning strategy:
 * <ul>
 * <li>If a partition is specified in the record, use it
 * <li>If no partition is specified but a key is present choose a partition based on a hash of the key
 * <li>If no partition or key is present choose a partition in a round-robin fashion
 */
Run Code Online (Sandbox Code Playgroud)


D. *_*nka 4

谢谢大家的帮助。但我找到了我的问题的答案。那么首先kafka至少有3个地方均衡负载:

  1. 为了将分区分配给消费者,使用“循环”或“范围”算法。这可以通过设置 partition.assignment.strategy属性来配置。默认情况下使用范围。
  2. 在生产者级别可以应用选择分区来存储消息的策略。可以通过以下方式完成partitioner.class
  3. 以及我的问题的答案。如果一个消费者处理消息很长时间,kafka会认为这个消费者已经死亡,并在另一个消费者之间重新分配分区。因此,当消费者完成长时间作业时,不会为其分配分区。当消费者完成长时间工作时,分区将被再次分配给它。并且不会有待处理的消息。