如何在同一主题中创建多个kafka消费者组

时间:2019-11-29 07:39:44

标签: apache-kafka consumer

以下是必填方案。

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

创建它

甚至Kafka文档也对此情况进行了说明,但没有地方提到如何做到这一点。 任何帮助表示赞赏!!!

2 个答案:

答案 0 :(得分:2)

Kafka消费者组是一组共享相同组ID的消费者。消费者组通过在各个消费者之间共享分区来分发处理。

下图显示了具有三个分区的单个主题和具有两个成员的使用者组。主题中的每个分区都被精确分配给组中的一个成员。 enter image description here

注意: 具有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:要消耗的分区从该分区的末尾开始,除非'--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);

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

参考:here

有以下几种替代方法:

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

答案 1 :(得分:0)

我现在无法尝试,但我认为您需要将其作为消费者财产通过

kafka-console-consumer.sh --consumer-property group.id=${your_group_id}

或者如果您有配置文件

kafka-console-consumer.sh --consumer.config ${your_config_file}