簡體   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