繁体   English   中英

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

[英]How to avoid duplication of messages that are being pushed into a Kafka topic using Node.js?

我有以下生产者代码:

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

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

Kafka FAQ的这一部分应该是有用的:

如何从Kafka获得一次准确的消息传递?

语义恰好有两个部分:避免在数据生成期间重复和避免在数据使用期间重复。

有两种方法可以在数据生成过程中仅获取一次语义:

对每个分区使用单个写入器,每当您遇到网络错误时,请检查该分区中的最后一条消息,以查看是否成功完成上一次写入。在消息中包括主键(UUID或其他内容),并在使用方上进行重复数据删除。

如果您执行这些操作之一,那么Kafka托管的日志将不会重复。 但是,没有重复的阅读也取决于消费者的一些合作。 如果使用者定期检查点的位置,则如果失败并重新启动,它将从检查点的位置重新开始。 因此,如果没有以原子方式写入数据输出和检查点,则也可以在此处获取重复项。 此问题特定于您的存储系统。 例如,如果您使用的是数据库,则可以在事务中将它们一起提交。 LinkedIn编写的HDFS加载程序Camus对Hadoop加载做了类似的事情。 另一个不需要事务的替代方法是使用主题/分区/偏移量组合将偏移量与加载的数据一起存储并进行重复数据删除。

我认为有两项改进可以使此操作变得容易得多:

通过有选择地在服务器上集成对此功能的支持,可以自动且便宜得多地实现生产者幂等。 现有的高级消费者没有提供很多更细粒度的偏移量控制(例如,重置职位)。 我们将尽快进行处理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM