我在kafka遇到了负载均衡的问题.所以,我创建了一个包含10个分区的主题并创建了2个消费者.这10个分区被划分并分配给这些消费者(第一个分区为5个分区,第二个分区为5分区),并且工作正常.有时第一个消费者工作,有时第二.
但是,在某一时刻,我们可能面临一种情况,例如第二个消费者收到消息并且需要时间(例如10分钟)来处理此消息.
那么,我的问题是kafka将如何决定将消息存储在哪个分区中?
在这种情况下循环我认为不是一个好主意,因为在第二个消费者完成长期工作之前,将不会处理由第二个消费者处理的分区中的消息.
更新!
根据@Milan Baran的回答,负载在生产者方面是平衡的.但是在这种情况下,即使我们提供自定义分区程序实现,也会出现同样的问题,即分配给分配给正在进行长期工作的使用者的分区中的消息将不会被处理,直到此消费者完成其长期工作.
可能是,其他地方还有额外的负载均衡器?
解决方法
应该使用哪个分区的决定不取决于kafka,但是发送消息的生产者必须做出决定.看看
https://kafka.apache.org/documentation#producerconfigs
您可以提供分区程序类来决定要选择的分区.
partitioner.class
Partitioner class that implements the Partitioner
interface. 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 */