👉 這是一個或許對你有用的社群
《專案實戰(影片)》:從書中學,往事上“練” 《網際網路高頻面試題》:面朝簡歷學習,春暖花開 《架構 x 系統設計》:摧枯拉朽,掌控面試高頻場景題 《精進 Java 學習指南》:系統學習,網際網路主流技術棧 《必讀 Java 原始碼專欄》:知其然,知其所以然

👉這是一個或許對你有用的開源專案國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERP、CRM、AI 大模型等等功能:
Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud 影片教程:https://doc.iocoder.cn 【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本
前言
有位粉絲去位元組面試。問了一道很經典的八股文:kafka為什麼這麼快 ?
其實這不就送分題嘛,哈哈~~ 我梳理了田螺版的答案:
-
批次處理思想 -
磁碟順序讀寫 -
零複製技術 -
頁快取加速訊息讀寫 -
分割槽與並行處理 -
資料壓縮
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/ruoyi-vue-pro 影片教程:https://doc.iocoder.cn/video/
1. 批次處理思想
之前寫SQL最佳化技巧的時候,就提到批次更新SQL ~~
假如你需要搬一萬塊磚到樓頂,你有一個電梯,電梯一次可以放適量的磚(最多放500),你可以選擇一次運送一塊磚,也可以一次運送500,你覺得哪個時間消耗大 ?

kafka為什麼這麼快,就是使用了批次操作 思想。
Kafka支援批次傳送和接收訊息 。生產者可以將多個訊息打包成一個批次傳送 ,消費者也可以一次性獲取多個訊息進行處理 。這樣可以減少網路開銷和磁碟I/O次數,提高效能。
-
Kafka生產者send()方法看似單條傳送,實則內部批次處理 。訊息先快取,待數量足夠或某個時間間隔 ,Kafka客戶端將其打包成批次,一併傳送給Broker。。 -
Broker服務端Kafka不會將訊息分批後逐條處理 ,因其效率低下。Kafka智慧地以批為單位處理訊息,整個Broker處理流程(寫入、讀取、複製),批訊息均保持原狀不被拆分 。 -
消費者從Broker拉取一批訊息 後,在客戶端拆分這批訊息,再逐條交給使用者程式碼處理。
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/yudao-cloud 影片教程:https://doc.iocoder.cn/video/
2. 磁碟順序讀寫
Kafka大量使用磁碟進行資料儲存,並採用順序寫入 的方式。順序寫入磁碟的速度遠遠高於隨機寫入,因為磁碟的物理結構決定了順序寫入可以減少磁頭的尋道時間 ,從而提高寫入速度。
kafka是如何使用順序讀寫提升磁碟IO效能的?
每個分割槽接收到的Producer訊息,均按順序被寫入對應的日誌檔案中,當檔案寫滿後,則開啟新檔案進行後續寫入。在消費環節,從全域性指定位置(即特定日誌檔案的特定偏移處)起,訊息被順序讀取。
3. 零複製技術
Kafka使用零複製技術將資料從磁碟直接傳送到網路,避免了在核心空間和使用者空間之間的多次資料複製。
傳統的檔案傳輸方式通常需要將資料從磁碟讀取到核心緩衝區,然後再從核心緩衝區複製到使用者空間,最後從使用者空間複製到網路緩衝區傳送出去。而零複製技術可以直接將資料從磁碟的檔案描述符傳遞給網路介面,減少了資料複製的次數和開銷。
傳統的IO流程:

-
使用者應用程序呼叫read函式,向作業系統發起IO呼叫,上下文從使用者態轉為核心態(切換1) -
DMA控制器把資料從磁碟中,讀取到核心緩衝區。 -
CPU把核心緩衝區資料,複製到使用者應用緩衝區,上下文從核心態轉為使用者態(切換2) ,read函式返回 -
使用者應用程序透過write函式,發起IO呼叫,上下文從使用者態轉為核心態(切換3) -
CPU將使用者緩衝區中的資料,複製到socket緩衝區 -
DMA控制器把資料從socket緩衝區,複製到網絡卡裝置,上下文從核心態切換回使用者態(切換4) ,write函式返回
sendfile+DMA scatter/gather 實現的零複製流程如下:

-
使用者程序發起sendfile系統呼叫,上下文(切換1)從使用者態轉向核心態 -
DMA控制器,把資料從硬碟中複製到核心緩衝區。 -
CPU把核心緩衝區中的檔案描述符資訊(包括核心緩衝區的記憶體地址和偏移量)傳送到socket緩衝區 -
DMA控制器根據檔案描述符資訊,直接把資料從核心緩衝區複製到網絡卡 -
上下文(切換2)從核心態切換回使用者態,sendfile呼叫返回。
Kafka 在處理大規模資料傳輸和儲存時,採用了幾種高效的零複製技術,主要包括:
-
sendfile:用於減少檔案讀取和網路傳輸中的記憶體複製,提高訊息傳輸效率。 -
DMA(硬體加速):在高效能硬體環境下,Kafka 可透過硬體支援的 DMA 技術來加速資料傳輸。
4. 頁快取加速訊息讀寫
Kafka利用PageCache(作業系統記憶體中的磁碟檔案快取 )來加速訊息的讀寫。
當應用程式讀寫檔案時,實際上操作的是PageCache中的副本。寫入時,資料先寫入PageCache,再批次寫到磁碟;讀取時,若PageCache中有資料則直接讀取,否則作業系統會從磁碟載入資料到PageCache。Kafka讀寫訊息時充分利用這一特性,由於訊息通常很快被消費,按LRU策略,PageCache命中率高。這既提高了讀取速度,又為寫入讓出了磁碟IO資源,間接提升了寫入效能。
5. 分割槽與並行處理
Kafka的主題(Topic )可以被分成多個分割槽(Partition ),每個分割槽可以分佈在不同的伺服器上。這樣可以實現並行寫入和讀取,提高了吞吐量。
其實以前寫介面最佳化的時候,就提到並行最佳化的方式,思想道理其實是一樣的:
比如一個查詢APP首頁查詢介面:查使用者資訊、查banner資訊、查彈窗資訊是序列的:

如果修改為並行,介面耗時將大大降低

6. 資料壓縮
生產者在傳送訊息到Kafka叢集之前,可以對訊息進行壓縮 。這種在生產者端進行壓縮的方式能夠減少傳送到Kafka叢集的資料量,從而降低網路傳輸的頻寬消耗,並提高資料傳輸的效率。
壓縮傳輸內容,傳輸報文變得更小,因此傳輸會更快啦。10M頻寬,傳輸10k的報文,一般比傳輸1M的會快呀。
打個比喻,一匹千里馬,它馱著100斤的貨跑得快,還是馱著10斤的貨物跑得快呢?
kafka生產者端壓縮演算法的型別主要有:
Snappy、GZIP、LZ4或zstd
等歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,“長按”或“掃描”下方二維碼噢:

星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。





文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)