kafka原理解析之 高效能內幕

2021-10-11 21:59:10 字數 1926 閱讀 3998

1. partition的持久化佇列結構:資料按先後順序依次追加在檔案末尾,讀寫操作分開,如下圖所示。

這種結構有如下優勢:

注:使用6個7200rpm、sata介面、raid-5的磁碟陣列在jbod配置下的順序寫入的效能約為600mb/秒,但隨機寫入的效能僅約為100k/秒,相差6000倍以上。

2. 利用作業系統pagecache:現代作業系統都提供了 read-ahead 和 write-behind 技術,

1. 大量小型i/o操作優化

小型的 i/o 操作發生在客戶端和服務端之間以及服務端自身的持久化操作中,為了避免這種情況,網路請求將多個訊息打包成一組,而不是每次傳送一條訊息,從而使整組訊息分擔網路中往返的開銷。

這個簡單的優化對速度有著數量級的提公升。批處理允許更大的網路資料報,更大的順序讀寫磁碟操作,連續的記憶體塊等等,所有這些都使 kafka

將隨機流訊息順序寫入到磁碟, 再由 consumers 進行消費。

2. 檔案拷貝優化檔案拷貝主要發生在consumer消費資料時需要從磁碟讀取資料並通過網路傳送給consumer。 存在兩種拷貝方式:

對比以上兩種方式可以看出,傳統方式有四次 copy 操作和兩次系統呼叫, 而zero-copy只拷貝2次。

普遍的應用場景:乙個 topic 被多消費者消費。使用 zero-copy(零拷貝),資料只會被複製到 pagecache中一次,節省了每次拷貝到使用者空間記憶體中,再從使用者空間進行讀取的消耗,同時pagecache和zero-copy的組合使用意味著,在乙個kafka集群中,大多數consumer 消費時,將看不到磁碟上的讀取活動,因為資料將完全由快取提供。 這使得訊息能夠以接近網路連線速度的上限進行消費

使用zero-copy方式有乙個重要前提:從磁碟讀出的資料塊不用修改就可以直接傳遞,為了滿足這個條件:

3. 端到端訊息批量壓縮

在某些情況下,資料傳輸的瓶頸不是 cpu ,也不是磁碟,而是網路頻寬。使用者可以一次乙個的壓縮訊息。但是這樣會造成非常差的壓縮比和訊息重複型別的冗餘,比如 json中的欄位名稱或 web日誌中的使用者**或公共字串值。高效能的壓縮是一次壓縮多個訊息,而不是壓縮單個訊息。

kafka以高效的批處理格式(recordbatch)支援一批訊息可以壓縮在一起傳送到伺服器。這批訊息將以壓縮格式寫入,並且在日誌中保持壓縮,只會在consumer消費時解壓縮。

4. nio多路復用技術同步非阻塞的接收producer推送的訊息:乙個單獨的接受執行緒和 n 個處理執行緒,每個執行緒處理固定數量的連線

1. 批量拉取資料: 批量拉取的好處在網路優化已經說明,不再介紹。

2. pull-based

broker起到蓄水池的作用,調節consumer、producer處理速率不一致的問題。

3. offset位置(跟蹤)

1. load balancing

2. asynchronous send

批處理是提公升效能的乙個主要驅動,為了允許批量處理,kafka 生產者會嘗試在記憶體中彙總資料,並用一次請求批次提交資訊。 批處理,不僅僅可以配置指定的訊息數量,也可以指定等待特定的延遲時間(如64k 或10ms),這允許彙總更多的資料後再傳送,在伺服器端也會減少更多的io操作。

kafka原理解析

kafka是大家比較常用的訊息中介軟體,本文主要介紹kafka基本元件及其相關原理 kafka通過offset保證訊息在分區內的順序,offset的順序性不跨分割槽 kafka0.10以後,使用乙個專門的topic consumer offset儲存offset consumer offset日誌留...

Kafka高效能讀寫原理

kafka是高吞吐低延遲的高併發 高效能的訊息中介軟體,在大資料領域有極為廣泛的運用。配置良好的kafka集群甚至可以做到每秒幾十萬 上百萬的超高併發寫入。那麼kafka到底是如何做到這麼高的吞吐量和效能的呢?首先kafka每次接收到資料都會往磁碟上去寫,如下圖所示。那麼在這裡我們不禁有乙個疑問了,...

kafka工作原理解析

三 kafka設計解析 有兩個生產者,生產topic 不同的topic表示不同訊息的型別 每乙個topic中的partition都會有副本 replices 例如乙個topic1,有兩個partition,另乙個topic有乙個partition 乙個partition對應 每乙個partition...