我使用HighlevelProducer和HighlevelConsumer来发送和接收消息。 HighlevelConsumer配置了autoCommit = false,因为我只想在成功生成消息时提交消息。问题是,第一条消息永远不会真正被提交。
示例:
如果我重新启动消费者,则会再次处理1到10之间的所有消息。只有当我向消费者发送新消息时,才会提交旧消息。任何数量的消息都会发生这种情况。
我的守则内容如下:
var kafka = require('kafka-node'),
HighLevelConsumer = kafka.HighLevelConsumer,
client = new kafka.Client("localhost:2181/");
consumer = new HighLevelConsumer(
client,
[
{ topic: 'mytopic' }
],
{
groupId: 'my-group',
id: "my-consumer-1",
autoCommit: false
}
);
consumer.on('message', function (message) {
console.log("consume: " + message.offset);
consumer.commit(function (err, data) {
console.log("commited:" + message.offset);
});
console.log("consumed:" + message.offset);
});
process.on('SIGINT', function () {
consumer.close(true, function () {
process.exit();
});
});
process.on('exit', function () {
consumer.close(true, function () {
process.exit();
});
});
var messages = 10;
var kafka = require('kafka-node'),
HighLevelProducer = kafka.HighLevelProducer,
client = new kafka.Client("localhost:2181/");
var producer = new HighLevelProducer(client, { partitionerType: 2, requireAcks: 1 });
producer.on('error', function (err) { console.log(err) });
producer.on('ready', function () {
for (i = 0; i < messages; i++) {
payloads = [{ topic: 'mytopic', messages: "" }];
producer.send(payloads, function (err, data) {
err ? console.log(i + "err", err) : console.log(i + "data", data);
});
}
});
我做错了什么,或者这是kafka-node中的错误?
答案 0 :(得分:0)
消息2的提交是消息1的隐式提交。
由于提交是异步完成的,并且消息1和消息2的提交在彼此之后快速完成(即,提交2发生在消费者确实发送1的提交之前),第一次提交将不会显式发生且仅将发送一次消息2提交。