1. 程式人生 > 其它 >2020-12-17

2020-12-17

技術標籤:kafkaJavakafkajava

Kafka生產者的冪等性和事務性

Kafka訊息交付可靠性定義

訊息交付可靠性保證,即指Kafka對Producer和Consumer要處理的資訊的保證。

  1. 最多一次:訊息可能會丟失,但絕對不會重複
  2. 至少一次:訊息不會丟失,但可能重複
  3. 精確一次:訊息不會丟失,也不會重複傳送

Kafka預設對訊息的保證是 至少一次

當然我們都希望精確一次。Kafka同樣也提供了對精確一次的實現。主要有兩種分別是冪等生產者和事務型生產者

冪等生產者

若開啟首先需要配置enable.idempotence = true,此時Producer會變成冪等性Producer。這個時候,當網路抖動,生產者沒有收到kafka返回的傳送成功響應,還是會再次傳送。但是Kafka會根據訊息進行篩選,若具有相同欄位值得訊息,則丟棄。

作用範圍

Producer程序的一次執行,並且是單節點的

事務生產者

若啟用

  1. 需要配置enable.idempotence=true
  2. 設定生產者的transactional.id
  3. producer程式碼需要顯示的使用事務的一些程式碼
producer.initTransactions();    //初始化事務
try {
            producer.beginTransaction();    //事務開始
            producer.send(record1);
            producer.send(record2);
            producer.commitTransaction();   //提交事務
} catch (KafkaException e) {
            producer.abortTransaction();    //回滾事務
}

kafka即使回滾也會將訊息寫入到底層日誌中。因此consumer端若想讀取事務型的生產者,則需要配置isolation.level=read_committed,即只能看到事務型生產者的訊息和非事務性生產者的訊息

PS:使用冪等性Producer和事務型Producer都會佔用更多地效能,這點需要考慮