消费者的node-kafka pause()方法。任何工作版本?

时间:2016-03-08 20:07:29

标签: node.js apache-kafka

我无法使用以下代码:

"use strict";

let kafka = require('kafka-node');
var conf = require('./providers/Config');

let client = new kafka.Client(conf.kafka.connectionString, conf.kafka.clientName);
let consumer = new kafka.HighLevelConsumer(client, [ { topic: conf.kafka.readTopic } ], { groupId: conf.kafka.clientName, paused: true });

let threads = 0;

consumer.on('message', function(message) {
    threads++;

    if (threads > 10) consumer.pause();

    if (threads > 50) process.exit(1);

    console.log(threads + " >>> " + message.value);
});

consumer.resume();

我通过终止声明在控制台和进程退出中看到50条消息。

我想要了解的是,我的代码是破碎还是打破了包裹?或者我可能只是做错了什么?有没有人能够通过暂停/恢复让卡夫卡消费者工作?我尝试了几个版本的kafka-node,但它们都表现相同。谢谢!

1 个答案:

答案 0 :(得分:3)

您已在代码中使用pauseresume,因此显然它们可以正常运行。 ;)

这是因为pause没有暂停消息的消费。它会暂停提取消息。我猜你在收到第一条消息之前已经在一次投掷中获得了前50个并且打电话给pause

对于踢,我刚刚在Node REPL中测试了pause()resume(),它们按预期工作:

var kafka = require('kafka-node');
var client = new kafka.Client('localhost:2181');
var consumer = new kafka.HighLevelConsumer(client, [{topic: 'MyTest'}]);
consumer.on('message', (msg) => { console.log(JSON.stringify(msg)) });

然后我进入另一个窗口并运行:

 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic MyTest

然后输入一些内容,它会显示在第一个窗口中。然后在第一个窗口中输入:consumer.pause();并在第二个窗口中输入更多内容。第一个窗口中没有任何内容。然后我在第一个窗口中运行consumer.resume(),并显示延迟的消息。

顺便说一下,您应该能够使用Kafka配置属性fetch.message.max.bytes并控制一次可以获取的消息数量。例如,如果您有500字节的固定宽度消息,请将fetch.message.max.bytes设置为小于1000(但大于500!)的内容,以便每次获取只接收一条消息。但请注意,这可能无法完全解决问题 - 我对Node很新,但它是异步的,我怀疑在完全处理第一次提取(或根本没有)之前,第二次提取可能会被启动。