kafka如何平衡分区加载?

时间:2016-11-11 13:55:30

标签: java performance apache-kafka load-balancing partition

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

但有一次我们可能会面临一种情况,例如第二个消费者收到消息时需要花费时间(例如10分钟)来处理此消息。

所以,我的问题是kafka将如何决定将消息存储到哪个分区?

在这种情况下循环我认为不是一个好主意,因为第二个消费者处理的分区中的消息不会被处理,直到第二个消费者完成长期工作。

已更新!

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

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

3 个答案:

答案 0 :(得分:3)

应该使用哪个分区的决定不取决于kafka,但是发送消息的生产者必须做出决定。看https://kafka.apache.org/documentation#producerconfigs

您可以提供分区程序类来决定要选择的分区。

  

partitioner.class
  实现分区程序的分区程序类   接口。 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
 */

答案 1 :(得分:2)

您需要的是 QUEUE MULTIPLE 消费者使用 ONE 分区。每个使用者从分区中获取记录,处理它并获取另一个记录。如果一个消费者花费太多时间来处理记录,其他人仍然可以从分区中获取(不同的)记录。

然而,Kafka NOT 支持此功能。每个分区只能由消费者组中的一个消费者使用。

总之,你需要其他东西来实现目标,例如RabbitMQ

答案 2 :(得分:2)

感谢大家的帮助。但我找到了我的问题的答案。首先,至少有3个地方负载kafka余额:

  1. 为消费者分配分区&#34;循环赛&#34;或&#34;范围&#34; 使用算法。这可以通过设置来配置 partition.assignment.strategy财产。默认情况下使用范围。
  2. 在生产者级别可以应用选择分区的策略 存储消息。可以通过partitioner.class
  3. 完成
  4. 我的问题的答案。如果一个消费者处理消息 很长一段时间,卡夫卡认为这个消费者已经死了 在另一个消费者之间重新分配分区。所以很长一段时间 作业由消费者完成,没有分配任何分区。什么时候 消费者完成长时间工作分区将被分配给 它再次。并且没有任何消息待处理。