Kafka 消费者组 是共享相同组 ID 的消费者的集合。 Consumer Group 通过在消费者之间共享分区来分配处理。
下图显示了一个包含三个分区的主题和一个包含两个成员的消费者组。主题中的每个分区都被分配给该组的一个成员。
注意:具有 n 个分区的主题最多可以被消费者组的 n 个消费者消费,每个消费者 1 个分区。
在您的情况下,如果您在主题上使用消费者组,则意味着所有分区都将分配给该消费者组。
但是如果你对消费者组不感兴趣,你可以直接为每个消费者组分配一个分区,这样就不会出现重新平衡
我正在使用 Kafka Confluent-kafka 2.6.0-5.1.2:
sh kafka-console-consumer --bootstrap-server localhost:9092 --partition 0 --topic abc --group cg1
sh kafka-console-consumer --bootstrap-server localhost:9092 --partition 1 --topic abc --group cg1
--partition : 从 Consumption 消费的分区从分区的末尾开始,除非 '--offset' 是
指定。
使用消费者组可以描述消费者的详细信息
sh kafka-consumer-groups --bootstrap-server localhost:9020 --describe --group a
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
abc 0 123 678 0 - - -
abc 1 234 345 0 - - -
您也可以通过Java手动分配分区,如下所示
List<TopicPartition> partitions = new ArrayList<>();
partitions.add(new TopicPartition("abc", 0));
partitions.add(new TopicPartition("abc", 1));
......
new KafkaConsumer<>(consumerProperties).assign(partitions);
请注意,不能将手动分区分配(即使用assign)与通过主题订阅(即使用订阅)进行动态分区分配混合使用。
参考:here
有以下替代方法:
- 使用 3 个单独的主题通过单独的消费者组来消费消息。
- 在使用消息时以编程方式过滤分区。