簡體   English   中英

Kafka 冪等生產者

[英]Kafka Idempotent producer

Kafka 文檔說,同一個生產者會話可以使用冪等生產者,我無法理解這一點。

比如說,Kafka 為每條消息添加序列號,最后一個序列號在 Kafka 中維護(不確定它在哪里維護)。

它如何生成序列號以及它保存在哪里?

為什么生產者崩潰並再次出現時無法保持序列?

我怎樣才能使它在生產者會話之間真正具有冪等性?

冪等生產者只在生產者進程的生命周期內有保證。 如果它崩潰,新的冪等 Producer 將擁有不同的 ProducerId 並開始它自己的序列。

序列號只是從 0 開始,並為每條記錄單調增加。 如果記錄無法傳遞,則會使用其現有序列號再次發送,以便代理對其進行重復數據刪除(如果需要)。 序列號是每個生產者和每個分區的。

目前,Kafka 不提供“繼續”冪等生產者會話的方法。 每次啟動時,它都會獲得一個新的唯一 ProducerId(由集群生成)

配置“冪等”僅在生產者沒有崩潰時才有效。

但是,對於事務,您可以在不同的分區之間只發送一次數據。 您使用生產者 ID(自動創建)設置交易 ID。 如果新的生產者 id 與相同的事務 id 到達,則意味着您遇到了問題。 然后,記錄將被寫入一次。

這是 Kafka 非常缺少的一個功能,我沒有看到一種優雅而有效的方法來解決它而不修改 Kafka 本身。

作為初步,如果您希望在任何故障(生產者或代理)中實現真正的冪等性,那么您絕對需要業務層(而不是較低級別的傳輸層)中的某種id

您可以在 Kafka 中使用這樣的 id 做的是:您的生產者至少向主題寫入一次,然后您有一個 Kafka Streams 進程,使用您的業務層 id 對該主題中的消息進行重復數據刪除,並將剩余的唯一消息發布到另一個話題。 為了提高效率,您應該使用單調遞增的 id,也就是序列號,否則您將不得不保留(並持久化)您見過的每個 id,這相當於內存泄漏,除非您限制重復數據刪除的能力到最后 x 天/小時/分鍾,並僅保留最新的 ID。

或者,您可以嘗試一下Apache Pulsar ,除了解決 Kafka 的其他痛點(必須執行昂貴的手動和容易出錯的重新平衡以擴展主題,僅舉一個例子)之外, 還內置了此功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM