精確一次語義
您可以為監聽器容器提供一個 KafkaAwareTransactionManager 例項。這樣配置後,容器會在呼叫監聽器之前啟動一個事務。監聽器執行的任何 KafkaTemplate 操作都將參與該事務。如果監聽器成功處理了記錄(或在使用 BatchMessageListener 時處理了多條記錄),容器會透過 producer.sendOffsetsToTransaction() 將偏移量傳送到事務,然後事務管理器提交事務。如果監聽器丟擲異常,事務將被回滾,消費者將被重新定位,以便在下一次輪詢時可以檢索到回滾的記錄。有關更多資訊以及如何處理重複失敗的記錄,請參見回滾後處理器。
使用事務可以實現精確一次語義(EOS)。
這意味著,對於一個 讀取 → 處理 → 寫入 序列,保證該 序列 只完成一次。(讀取和處理具有至少一次語義)。
Spring for Apache Kafka 3.0 及更高版本僅支援 EOSMode.V2
-
V2- 又稱 fetch-offset-request fencing (自版本 2.5 起)
| 這要求代理版本為 2.5 或更高。 |
在 V2 模式下,不需要為每個 group.id/topic/partition 都有一個生產者,因為消費者元資料會隨偏移量一起傳送到事務中,並且代理可以根據這些資訊確定生產者是否被隔離。
請參閱 KIP-447 瞭解更多資訊。
V2 之前是 BETA;EOSMode 已更改以使框架與 KIP-732 保持一致。