Kafka總結系列(三)

2021-07-14 00:07:03 字數 1903 閱讀 7303

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高度依賴於檔案系統來儲存和快取訊息。對於磁碟的正確認識 對磁碟的線性讀寫比隨機讀寫快很多倍,且有研究表明 對磁碟的線性讀寫在有些情況下可以比記憶體的隨機訪問要更快!在訊息佇列系統中,如果磁碟的因素被排除之後 線性讀寫磁碟的速度並不那麼慢 還有兩個原因會導致inefficiency 太多io...

Kafka系列 Kafka核心概念

kafka系列文章 kafka系列 入門及應用場景 部署 簡單測試 bin kafka topics.sh create zookeeper 192.168.137.141 2181,192.168.137.142 2181,192.168.137.143 2181 kafka replicatio...

kafka系列4 什麼是kafka

關於什麼是kafka,看過乙個簡單例子。舉個例子,生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產乙個雞蛋,消費者就消費乙個雞蛋,假設消費者消費雞蛋的時候噎住了 系統宕機了 生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再比如生產者很強勁 大交易量的情況 生產者1秒鐘生產100個雞蛋,消費者1...