kafka的傳遞機制與語義保障

2021-07-27 15:26:50 字數 1903 閱讀 6085

kafka的消費者通過向broker傳送「fetch」請求獲取他要消費的partition的資訊。消費者在每個請求中標記他已經消費到的offset值,broker將以該offset作為起始位置的a chunk of log即一批訊息返回給consumer。可見消費者自己維護消費狀態,broker是無狀態的,如有需要可重複消費。

在kafka的設計中,producer將訊息push給broker,consumer從broker那裡pull訊息進行消費。基於push的模式,很難適應不同特點的consumer,push時,訊息的傳送速率完全由broker掌控。該設計的初衷是消費者以最大的速率進行消費,但是

每個consumer的硬體效能、消費能力不同

,一旦消費速度遠遠落後於生產速度,就會出現拒絕服務等異常。pull模式消費者可以依據其自身能力進行消費,每次消費完後他都會pull一批訊息(可以設定size),沒有不必要的等待時間。

pull模式的缺點是:當broker中沒有未被消費的資料時,即offset已經是最新值了,consumer會一直迴圈,進入忙等待的狀態。為了避免這種情況,允許consumer阻塞在「long poll」的等待中,直到資料到達,(也可以設定為一直等待until a given number of bytes)。consumer的配置檔案中可以設定:fetch.min.bytes,表示consumer發起一次fetch請求,broker應該返回給他的最小位元組數,如果broker端沒有這麼多訊息,則請求被阻塞,一直等待,累積夠這麼多資料才返回。同時為了避免無止境的等待,可以設定:fetch.wait.max.ms,表示等待的最長時間。

追蹤記錄已經被消費掉的資料非常重要,kafka中利用offset,且由consumer自己維護。

許多訊息系統會在broker端儲存元資料資訊,記錄哪些訊息已被消費過。這種情況下存在乙個問題:當一條訊息傳送給consumer之後,broker可以立即修改狀態變為已消費,或者等到consumer的確認後才修改狀態。如果broker發出訊息後立即更新狀態標記為consumed,則可能發生意外,使consumer未真正消費到這條訊息,訊息被丟失;為了克服這一點,許多訊息系統增加了確認機制,即:發出訊息後只是標記為send,等consumer真正消費完返回確認訊號後才標記為consumed。這種方式確實可以避免丟失訊息,但如果consumer已處理了該條訊息,但是傳送確認訊號之前出故障了,那麼確認丟失,訊息便會被重複消費兩次;另乙個缺點就是增加確認機制必然導致效能降低,broker需要為每條訊息維護多個狀態,還需要處理異常情況。broker負載太重。

(kafka中broker無狀態,consumer自己維護offset,同樣可以在發出fetch請求後更新offset值,或者消費完這條訊息之後才修改offset。你可以根據實際應用對可靠性的需求選擇任意一種方式,立即修改值可能導致發生故障時,例如網路斷開,訊息得不到處理便丟失了。)

kafka的設計則避免了以上的複雜情況。consumer只消費乙個partition,他只需要維護乙個整形數值,表明下次消費的訊息位置。而且,consumer會定期向zookeeper提交他的offset,避免自己crash之後繼續消費。(可以詳細看一下consumer的引數)

訊息傳遞的可靠性保證:(涉及producer到broker、consumer與broker,即生產者端和消費者端)

at most once:訊息可能會丟失但絕不重傳;

at least once:從不丟失,可能重傳;

exactly once:最理想的狀態,訊息只被傳送一次,不丟失也不重傳,kafka目前不能保證;

對於producer:傳送一條訊息給broker,只有訊息被commit to the log,才算傳送成功。由於broker 有備份機制,所以使用者可以設定自己想要的可靠性:

request.required.acks:

對於consumer:消費一條訊息,之後更新offset,有以下幾種方式:

Kafka中的訊息傳遞保證語義

目錄 kafka提供的訊息傳遞保證語義 producer的訊息傳遞語義 at least once傳遞語義 exactly once傳遞語義 request.required.acks永續性級別 consumer的offset記錄方式 記錄offset的位置 提交offset方法 自動提交offse...

Kafka的消費語義

at most once 最多消費一次 訊息0 1 訊息可能丟失 但是不會重複消費 log 解釋 消費者的offset已經提交,但是訊息還在處理,這個時候掛了,再重啟的時候會從上次提交的offset處消費,導致上次在處理的訊息部分丟失。at least once 至少消費1次 訊息 1 消費不可能丟...

Kafka高階 工作機制與檔案儲存機制

producer向topic leader分類推送資料,每乙個佇列的主題都不同。topic leader向topic follower實時備份資料,防止topic leader突然掛掉。consumer消費topic leader中的資料,以offset為標誌,表示消費到的位置,以便出錯恢復時,從上...