使用主题模式时的负载平衡Kafka记录消耗

时间:2019-02-08 14:29:37

标签: java apache-kafka kafka-consumer-api

如果使用相同使用者组(group.id)的两个进程都订阅了相同的 topicPattern -那么Kafka会在两个进程之间对已解决的主题进行负载均衡吗?

在我的案例中,大约有400个主题与模式匹配,并且每个主题都有一个部分。我想知道是否可以通过具有相同使用者组的不同流程来负载均衡主题的消耗,但是似乎只有一个流程可以处理所有主题。这是因为仅分区是负载均衡的?还是因为预订使用了主题 pattern


我做了一些更深入的调试。我的测试设置实际上不是两个进程,而是两个线程-我想那应该没关系。调试打印主题描述,输出类似以下内容(IP混淆):

(groupId=foo-bar-group, isSimpleConsumerGroup=false, 
  members=
   (memberId=KafkaTestApplication:KafkaTestApplication-1-20126d55-678d-46f5-bc73-3769db2c8901, 
     clientId=KafkaTestApplication:KafkaTestApplication-1, 
     host=/aa.bb.c.dd, 
     assignment=(topicPartitions= <all topics here>)),
   (memberId=KafkaTestApplication:KafkaTestApplication-2-8d34e81a-8f57-4d4e-bd9e-b56edc4e706c, 
     clientId=KafkaTestApplication:KafkaTestApplication-2,
     host=/aa.bb.c.dd, 
     assignment=(topicPartitions=)), 
     partitionAssignor=range, 
     state=Stable, 
     coordinator=aaa.bb.ccc.d:9092 (id: 9 rack: null)
)

我可以看到消费者组中有两个不同的成员,并且具有两个不同的clientId。但是,所有主题都分配给了第一个使用者,而第二个使用者没有分配主题。我希望两个成员都能得到一些话题。两名成员每隔几秒钟进行一次投票。

2 个答案:

答案 0 :(得分:1)

同一小组的第二个进程开始时,小组应该重新分配主题分区分配,是的。

但是,我没有任何订阅模式方面的经验,但是我希望它的工作方式不同于提供直接的主题列表

答案 1 :(得分:0)

我终于找到了要进行更改以实现所需的主题/分区平衡的方法。我必须设置Consumer属性

partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor

默认settig(org.apache.kafka.clients.consumer.RangeAssignor)无法用于我的设置。为什么将here解释为注释中提到的user152468。谢谢你!