我一直在看码头,现在想知道这是否是kafka或node-kafka的特征。
所以我的消费者收到了来自kafka的消息,当我处理消息时,我喜欢将其标记为好像我没有得到它,直到我完成处理它。这样,如果服务器在处理过程中崩溃,我可以重新连接并接收我的应用程序在崩溃之前收到的消息。
高级示例。
这样,如果任何步骤在第5步之前崩溃,则当服务器备份时,它会再次收到失败的消息。
我正在使用node.js LTS 8.10.0
和npm包kafka-node@2.4.1
答案 0 :(得分:2)
我赞成无效,因为他的回答帮助我找到了我在kafka-node中所需要的东西。这里只是node.js的回答/示例。
const kafkaConfig = config.get('kafka');
const kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaConfig.host});
const consumer = new kafka.Consumer(kafkaClient, [{topic: kafkaConfig.topic}], {autoCommit: false});
const offset = new kafka.Offset(kafkaClient);
// very import to retrieve the offset
offset.fetchLatestOffsets([kafkaConfig.topic], (error, offsets) => {
const latestOffset = offsets[kafkaConfig.topic][0];
consumer.setOffset(kafkaConfig.topic, 0, latestOffset);
});
consumer.on('message', message => {
// do stuff
Log.insert({message})
.then(() => {
// commit the success so that kafka will update the offset
consumer.commit((err, data) => console.log(err, data));
})
});
答案 1 :(得分:1)
执行此操作的方法是将上次读取的偏移量保存到您喜欢的数据库中。这样,您可以使用此偏移量从下次重新启动时启动您的使用者。
Kafka提供了一种内置版本> 0.8
的机制。 Kafka将消费者组读取的最新偏移量存储到名为consumer_offsets
的内部主题中。大多数客户端库都有自动提交最后处理的偏移量的规定,或者您可以选择禁用自动提交并在整个处理完成后自行提交偏移量。