Kafka的“至少一次”(At Least Once)和“精確一次”(Exactly Once)是兩種不同的訊息傳遞語義,它們在確保訊息傳遞的可靠性和準確性方面有不同的特點和實現方式。
一、至少一次(At Least Once)
-
定義:
“至少一次”傳遞語義意味著生產者傳送到Kafka的訊息會至少被傳遞一次到消費者。即使出現某些故障或錯誤,也不會導致訊息丟失。 -
實現機制:
Kafka透過其分割槽複製機制和訊息日誌的永續性來實現“至少一次”傳遞語義。當生產者傳送訊息到Kafka時,Kafka會確保訊息被寫入到至少一個分割槽的日誌中,並且這個日誌是持久化的。 -
注意事項:
- 雖然“至少一次”傳遞語義可以確保訊息不會丟失,但它也可能導致訊息被重複傳遞。
- 消費者需要能夠處理重複的訊息,因為生產者可能會因為網路故障或其他原因而重新傳送訊息。
二、精確一次(Exactly Once)
-
定義:
“精確一次”傳遞語義是指訊息會被成功傳遞一次且僅一次到消費者,既不會丟失也不會重複。 -
實現機制:
Kafka透過結合冪等性(Idempotence)和事務(Transactions)來實現“精確一次”傳遞語義。- 冪等性:冪等生產者可以確保在單個分割槽和會話中,相同的訊息多次傳送不會引起狀態變更。冪等性是透過為每個生產者分配一個唯一的PID(Producer ID),併為每個目標分割槽維護一個序列號來實現的。當生產者傳送訊息時,Kafka會檢查訊息的PID和序列號,如果它們與之前已經接收到的訊息相同,則Kafka會丟棄該訊息,以避免重複。
- 事務:事務生產者可以在跨分割槽和跨會話中提供“精確一次”傳遞語義的保證。Kafka引入了事務協調器(Transaction Coordinator)來管理事務的狀態。生產者可以透過事務協調器開啟一個事務,並在事務中傳送多條訊息。這些訊息要麼全部成功傳遞,要麼全部失敗,從而確保跨分割槽和跨會話的訊息一致性。
-
注意事項:
- 要實現“精確一次”傳遞語義,需要啟用冪等性(將生產者的
enable.idempotence
引數設定為true
)並使用事務API。 - “精確一次”傳遞語義的實現相對複雜,並且可能會對Kafka叢集的效能產生一定的影響。因此,在選擇使用“精確一次”傳遞語義時,需要權衡其帶來的可靠性和效能之間的平衡。
- 要實現“精確一次”傳遞語義,需要啟用冪等性(將生產者的
三、比較與總結
- 可靠性:
- “至少一次”傳遞語義可以確保訊息不會丟失,但可能會導致訊息重複。
- “精確一次”傳遞語義可以確保訊息既不會丟失也不會重複,但實現起來相對複雜。
- 效能:
- “至少一次”傳遞語義通常具有更好的效能,因為它不需要額外的機制來確保訊息的唯一性。
- “精確一次”傳遞語義可能會引入額外的開銷,如事務協調器的管理和冪等性的檢查等,從而影響效能。
- 應用場景:
- “至少一次”傳遞語義適用於對訊息丟失敏感但對訊息重複不太敏感的場景。
- “精確一次”傳遞語義適用於對訊息丟失和重複都非常敏感的場景,如金融交易等。
綜上所述,Kafka的“至少一次”和“精確一次”傳遞語義各有優缺點,適用於不同的應用場景。在選擇使用哪種語義時,需要根據具體的需求和場景進行權衡。