apache-kafka - 如何在同一主题中创建多个 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 文档也解释了这种情况,但没有提到如何去做。任何帮助表示赞赏!
解决方案
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);
请注意,通过主题订阅(即使用订阅)将手动分区分配(即使用分配)与动态分区分配混合是不可能的。
参考:这里
有以下替代方法:
- 使用 3 个单独的主题使用单独的消费者组来消费消息。
- 在使用消息时以编程方式过滤分区。
推荐阅读
- javascript - 如何在 Adobe Acrobat DC 中定义 JavaScript 脚本中的字符串编码
- json - SQL查询返回包含数组的Json
- c++ - c++ 控制台应用程序,如何在控制台外打印字符
- powershell - Powershell - 将 SQL 与 AD 进行比较
- r - 根据R中不同data.frame的日期间隔平均一列
- javascript - D3 一般更新模式:在添加新元素之前删除旧元素
- ruby-on-rails - Rails:密码不能为空,BCrypt
- angular - 在单击按钮时加载数据时 mat-paginator 不起作用
- swift - 无法使用swift从uicollectionview中的firebase中删除正确的图片
- html - 无法让 css 文件链接到 html