我无法使用以下代码:
"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,但它们都表现相同。谢谢!
答案 0 :(得分:3)
您已在代码中使用pause
和resume
,因此显然它们可以正常运行。 ;)
这是因为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很新,但它是异步的,我怀疑在完全处理第一次提取(或根本没有)之前,第二次提取可能会被启动。