kafka 事務模型

2021-09-24 22:04:10 字數 2197 閱讀 9006

kafka 在 0.11.0.0 版本中新增了事務支援,同時增加了 『精確一次』 的傳送語義用於支援事務模型:

exactly once,this is what people actually want, each message is delivered once and only once

簡單的解釋下 kafka 如何支援 』精確一次『 的語義:

(1)生產者執行 inittransactions() ,在事務協調者獲取當前生產者的 producer id,這個 id 本質是在 zookeeper 上獲取 的,每台 broker 機器有 1000 個 id 的範圍選擇,如果使用完畢在 zk 上遞增增加範圍,為了保證 producer id 不重複

(2)broker 記錄了 producer 的 代 的資訊,同時 producer 和 broker 同時記錄當前的生產者在所在的代中 sequence number,如果 number 不匹配則拒絕訊息的傳送同時告知 producer 重新獲取 id 和 代資訊並重置 sequence number

(3)broker 根據記錄的 producer id 和 對應的 sequence number 來去重,已經傳送過的訊息 number 不會再次記錄

參考: kafka cwiki.apache.org .

主要了解決 kafka-stream 存在的消費-處理-傳送模型,因為對於 kafka 來說這是乙個原子性的動作,這其中乙個環節失敗會重試的會導致業務重複處理,例如 計算某些業務統計值,處理完畢後傳送消費 offset 失敗但是訊息傳送成功,會導致重複計算。

處理不了的問題:業務系統的資料庫等資料來源並不能和 kafka 事務聯絡在一起,它並沒有考慮業務系統的事務問題,它只解決了自己的系列產品的原子性語義。例如rocket mq就提供了簡單的和業務系統關聯的事務介面

properties props = new properties();

props.put("transactional.id", "test-transactional");

producerproducer = new kafkaproducer<>(props);

producer.inittransactions();

try catch (producerfencedexception e1) catch (kafkaexception e2)

使用上非常簡單,配置 transactional.id(如果使用事務,必須且唯一,事務協調者用於處理與其關聯的事務),和 jdbc 的事務使用上很相似

kafka 事務本質是 2pc 模式,消費 offset 本質上也是傳送訊息到指定的 topic 中:

流程說明:

消費者如果配置消費已提交的隔離級別,那麼 broker 會根據lso傳送訊息至消費者,而不是普通的最低水位

事務協調者類似 消費者組協調者,本質上都是利用 kafka 本身的 topic log 進行一些持久化必要資訊的操作(topic log 本身提供高可用,所以不必擔心資訊丟失):

生產者開啟事務後,會與自己事務協調者 queue 所屬的 leader 進行通訊,其實本質就是根據事務id 進行 hash 計算的,之後的一些列 2pc 互動都與自己的協調者進行溝通,為什麼選擇 leader 作為協調者,因為它和組協調者一樣,會在記憶體中快取一些訊息內容,不必每次都去讀取 log 檔案內容來獲取。

kafka 的事務本質上 2pc 提交,不過發起都是由 producer 進行發起,協作者幫助記錄資訊,最後一步提交後才由協調者發起,標記事務訊息被提交。

kafka 的事務的資料來源只有自己的 topic log,如果需要和應用程式的資料來源結合使用,保證事務性還需要一些額外的操作,具體如何操作之後會專門發篇文章來說明,如果使用 kafka-stream 系列產品,就可開箱即用,還是很方便的。

詳解Kafka事務

kafka從0.11版本開始引入了事務支援。事務可以保證kafka在exactly once語義的基礎上,生產者和消費者可以跨分割槽會話,要麼全部成功,要麼全部失敗。1.producer 事務 2.consumer 事務 上述事務機制主要是從 producer 方面考慮,對於 consumer 而言...

Kafka訊息模型

一 訊息傳遞模型 傳統的訊息佇列最少提供兩種訊息模型,一種p2p,一種pub sub,而kafka並沒有這麼做,巧妙的,它提供了乙個消費者組的概念,乙個訊息可以被多個消費者組消費,但是只能被乙個消費者組裡的乙個消費者消費,這樣當只有乙個消費者組時就等同與p2p模型,當存在多個消費者組時就是pub s...

kafka事務使用

kafka提供事務主要是為了實現精確一次處理語義 exactly once semantics,eos 的,而eos是實現流處理系統正確性 correctness 的基石,故kafka事務被大量應用於kafka streams之中。不過使用者當然也能夠呼叫api實現自己的事務需求。具體的場景包括 1...