2020-12-17
阿新 • • 發佈:2020-12-18
Kafka生產者的冪等性和事務性
Kafka訊息交付可靠性定義
訊息交付可靠性保證,即指Kafka對Producer和Consumer要處理的資訊的保證。
- 最多一次:訊息可能會丟失,但絕對不會重複
- 至少一次:訊息不會丟失,但可能重複
- 精確一次:訊息不會丟失,也不會重複傳送
Kafka預設對訊息的保證是 至少一次
當然我們都希望精確一次。Kafka同樣也提供了對精確一次的實現。主要有兩種分別是冪等生產者和事務型生產者
冪等生產者
若開啟首先需要配置enable.idempotence = true,此時Producer會變成冪等性Producer。這個時候,當網路抖動,生產者沒有收到kafka返回的傳送成功響應,還是會再次傳送。但是Kafka會根據訊息進行篩選,若具有相同欄位值得訊息,則丟棄。
作用範圍
Producer程序的一次執行,並且是單節點的
事務生產者
若啟用
- 需要配置enable.idempotence=true
- 設定生產者的transactional.id
- 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都會佔用更多地效能,這點需要考慮