Kafka(kafka节点)消费者组从所有分区接收消息

时间:2019-09-07 21:08:36

标签: node.js apache-kafka

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

当我将组ID设置为“测试组”的使用者(消费者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项目中运行两个使用者,则一行将一个使用者分配给所有分区。但是,消费者ID在我的两个客户端之间来回切换。

当我启动命令行客户端(bin/kafka-console-consumer.sh --bootstrap-server localhost:32769 --topic test-topic --from-beginning --group test-group)时,它发生了变化,并且所有三个使用者都出现并在每个分区之间划分。删除kafka-console-consumer客户端后,它就会恢复到我先前描述的内容。

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

1 个答案:

答案 0 :(得分:0)

  

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

你是对的。

  

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

据我所知,您的做法是正确的。我认为这是kafka-node库中的错误,如果您使用的是最新版本(例如2.3),建议您尝试降级Kafka版本(例如,使用Kafka 2.1.0尝试此代码)。