首页 > 解决方案 > 如何在同一主题中创建多个 kafka 消费者组

问题描述

以下是必需的场景。

Topic-1 有 6 个分区,现在我想创建 3 个消费者组 cg1、cg2 和 cg3 并像这样映射它 (cg1 - 0,1 ; cg2 - 2,3 ; cg3 - 4,5)。如何使用 kafka-console-consumer.sh 或 kafka-consumer-groups.sh 创建它

甚至 Kafka 文档也解释了这种情况,但没有提到如何去做。任何帮助表示赞赏!

标签: apache-kafkaconsumer

解决方案


Kafka 消费者组是共享相同组 id 的消费者的集合。消费者组通过在消费者之间共享分区来分配处理。

下图显示了具有三个分区的单个主题和具有两个成员的消费者组。主题中的每个分区都被分配给该组的一个成员。 在此处输入图像描述

注意: 具有 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 <Integer: partition> :除非指定了“--offset”,否则从Consumption 消费的分区从分区的末尾开始。

使用消费者组,您可以描述消费者详细信息

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);

请注意,通过主题订阅(即使用订阅)将手动分区分配(即使用分配)与动态分区分配混合是不可能的。

参考:这里

有以下替代方法:

  1. 使用 3 个单独的主题使用单独的消费者组来消费消息。
  2. 在使用消息时以编程方式过滤分区。

推荐阅读