我在kafka遇到了负载均衡的问题。所以,我创建了一个包含10个分区的主题并创建了2个消费者。这10个分区被分割并分配给这些消费者(第一个分区为5个分区,第二个分区为5分区),并且工作正常。有时第一个消费者工作,有时是第二个。
但有一次我们可能会面临一种情况,例如第二个消费者收到消息时需要花费时间(例如10分钟)来处理此消息。
所以,我的问题是kafka将如何决定将消息存储到哪个分区?
在这种情况下循环我认为不是一个好主意,因为第二个消费者处理的分区中的消息不会被处理,直到第二个消费者完成长期工作。
已更新!
根据@Milan Baran的回答,负载在生产者方面是平衡的。但是在这种情况下,即使我们提供自定义Partitioner
实现,分配给分配给正在进行长期工作的消费者的分区中的消息也不会是同样的问题。处理完毕直到这位消费者完成其长期工作。
可能是,其他地方还有额外的负载均衡器吗?
答案 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余额:
partition.assignment.strategy
财产。默认情况下使用范围。partitioner.class