我有以下生产者代码:
var kafka = require('kafka-node');
var KafkaProducer = kafka.Producer;
var KeyedMessage = kafka.KeyedMessage;
var jsonRequest = JSON.stringify(request.object);
//I have to define client every time this endpoint is hit.
var client = new kafka.Client();
var producerKafka = new KafkaProducer(client);
var km = new KeyedMessage('key', 'message');
payloads = [
{ topic: 'collect-response', messages: jsonRequest, partition: 0 }
];
producerKafka.on('ready', function () {
producerKafka.send(payloads, function (err, data) {
console.log(data);
});
});
producerKafka.on('error', function (err) {})
现在,我的任务是避免重复写入此处的消息。
答案 0 :(得分:0)
This section Kafka常见问题应该很有用:
如何从Kafka获得一次完整的消息?
一旦语义有两个部分:避免数据期间的重复 生产 并避免在数据消费过程中出现重复。
有两种方法可以在数据期间获得完全一次的语义 生产:
每个分区和每次获得网络时都使用单个写入器 错误检查该分区中的最后一条消息,看看你的最后一条消息 写成功包括主键(UUID或其他) 对消费者的消息和重复数据删除。
如果你做其中一件事,Kafka主持的日志就是 复制免费。但是,没有重复的阅读取决于一些 来自消费者的合作也是如此。如果消费者是定期的 检查其位置然后如果失败并重新启动它将 从检查点位置重新启动。因此,如果数据输出和 检查点不是原子地写的,有可能得到 这里也重复一遍。此问题特别适用于您的存储 系统。例如,如果您使用的是数据库,则可以提交 这些在一起交易中。 LinkedIn的HDFS加载器Camus 写道为Hadoop加载做了类似的事情。另一种选择 不需要交易的是用它存储偏移量 使用主题/分区/偏移量加载和重复数据删除的数据 组合
我认为有两项改进可以使这更容易:
生产者幂等可以自动完成并且更便宜 通过在服务器上有选择地集成对此的支持。现有的 高级消费者并没有暴露出更多细粒度的消费者 控制抵消(例如重置你的位置)。我们会工作的 很快