node.js - Kafka(kafka-node)消费者组接收来自所有分区的消息

标签 node.js apache-kafka

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

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

当我在同一组中启动另一个消费者(consumer-2)时,问题就出现了。我希望它能够重新平衡两个消费者之间的划分分区,例如Consumer-1 获取分区 0 和 2,consumer-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 客户端,它就会回到我之前描述的状态。

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

最佳答案

I expect it to be re-balanced dividing partitions between the two consumers e.g. consumer-1 gets partition 0 and 2 and consumer-2 gets partition 1

你说得对。

Have I misunderstood the concept of partitions and consumer groups or maybe I have the wrong configuration?

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

关于node.js - Kafka(kafka-node)消费者组接收来自所有分区的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837480/

相关文章:

mysql - 设置 Docker MySql 数据库并将其连接到 BE

apache-kafka - 如果集群中有一个节点宕机,Zookeeper 将无法正常工作

apache-kafka - 如何在kafka中定义多个序列化器?

java - Apache Kafka 生产者错误 : Failed to send message after 3 tries

python - Kafka 10 - 具有身份验证和授权的 Python 客户端

node.js - npm install 不显示已安装的依赖项

javascript - 它们如何代表电影在 imdb、烂番茄上的平均评分?

javascript - 用户 session 未在 Node.js 服务器上更新

javascript - Mongodb - Express,如何正确获取 "id"?它给出一个空的 [Object, Object]

apache-kafka - 使用 com.ibm.security.auth.module.Krb5LoginModule 时如何设置 JAAS serviceName