首页 > 解决方案 > Kafka(kafka-node)消费者组接收来自所有分区的消息

问题描述

我有一个名为“test-topic”的主题,有 3 个分区。

当我启动一个将 group-id 设置为“test-group”的消费者(consumer-1)时,它会连接并从该主题的所有分区中读取。到目前为止,一切都很好。

当我在同一组中启动另一个消费者(消费者 2)时,问题就出现了。我希望它在两个消费者之间重新平衡划分分区,例如消费者 1 获得分区 0 和 2,消费者 2 获得分区 1。这不会发生,当然我确实得到了这些重新平衡回调,但最后,两个消费者都从同一个分区读取。

更奇怪的是,如果我启动另一个 Kafka 附带的消费者(kafka-console-consumer.sh),那么它将按预期在所有消费者之间重新平衡和划分所有分区。

我正在使用带有以下选项的 kafka-node:

options = {
    groupId: 'test-group',
    kafkaHost: 'localhost:32769',
    protocol: ['range'],
    fromOffset: 'latest'
}

let topics = ['test-topic']

let consumer = new KafkaConsumerGroup(options, topics)

我看到运行以下命令:kafka-consumer-groups.sh --bootstrap-server localhost:32769 --describe --group test-group --members --verbose

如果我只从我的 nodejs 项目中运行我的两个消费者,那么一条消费者分配给所有分区。但是 CONSUMER-ID 在我的两个客户端之间来回切换。

当我启动命令行客户端bin/kafka-console-consumer.sh --bootstrap-server localhost:32769 --topic test-topic --from-beginning --group test-group(一旦我删除了 kafka-console-consumer 客户端,它就会回到我之前描述的内容。

我是否误解了分区和消费者组的概念,或者我的配置有误?

标签: node.jsapache-kafka

解决方案


我希望在两个消费者之间重新平衡划分分区,例如消费者 1 获得分区 0 和 2,消费者 2 获得分区 1

你说的对。

我是否误解了分区和消费者组的概念,或者我的配置有误?

正如我所看到的,您一切都在以正确的方式进行。我认为这是 kafka-node 库中的一个错误,如果您使用的是最新版本(例如 2.3),我建议您尝试降级 Kafka 版本(例如,使用 Kafka 2.1.0 尝试此代码)。


推荐阅读