如何避免使用Node.js重复推送到Kafka主题的消息?

时间:2018-05-16 08:27:28

标签: node.js apache-kafka

我有以下生产者代码:

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) {})

现在,我的任务是避免重复写入此处的消息。

1 个答案:

答案 0 :(得分:0)

This section Kafka常见问题应该很有用:

  

如何从Kafka获得一次完整的消息?

     

一旦语义有两个部分:避免数据期间的重复   生产   并避免在数据消费过程中出现重复。

     

有两种方法可以在数据期间获得完全一次的语义   生产:

     

每个分区和每次获得网络时都使用单个写入器   错误检查该分区中的最后一条消息,看看你的最后一条消息   写成功包括主键(UUID或其他)   对消费者的消息和重复数据删除。

     

如果你做其中一件事,Kafka主持的日志就是   复制免费。但是,没有重复的阅读取决于一些   来自消费者的合作也是如此。如果消费者是定期的   检查其位置然后如果失败并重新启动它将   从检查点位置重新启动。因此,如果数据输出和   检查点不是原子地写的,有可能得到   这里也重复一遍。此问题特别适用于您的存储   系统。例如,如果您使用的是数据库,则可以提交   这些在一起交易中。 LinkedIn的HDFS加载器Camus   写道为Hadoop加载做了类似的事情。另一种选择   不需要交易的是用它存储偏移量   使用主题/分区/偏移量加载和重复数据删除的数据   组合

     

我认为有两项改进可以使这更容易:

     

生产者幂等可以自动完成并且更便宜   通过在服务器上有选择地集成对此的支持。现有的   高级消费者并没有暴露出更多细粒度的消费者   控制抵消(例如重置你的位置)。我们会工作的   很快