Kafka為什麼效能這麼快?4大核心原因詳解
Kafka的效能快這是大廠Java面試經常問的一個話題,下面我就重點講解Kafka為什麼效能這麼快的4大核心原因@
1、頁快取技術
Kafka 是基於作業系統 的頁快取(page cache)來實現檔案寫入的,我們也可以稱之為 os cache,意思就是作業系統自己管理的快取。
Kafka 在寫入磁碟檔案的時候,可以直接寫入這個 os cache 裡,也就是僅僅寫入記憶體中,接下來由作業系統自己決定什麼時候把 os cache 裡的資料真的刷入磁碟檔案中。
透過這一個步驟,就可以將磁碟檔案寫效能提升很多了,因為其實這裡相當於是在寫記憶體,不是在寫磁碟,原理圖如下:
2、磁碟順序寫
另一個主要功能是 kafka 寫資料的時候,是以磁碟順序寫的方式來寫的,也就是說僅僅將資料追加到檔案的末尾,不是在檔案的隨機位置來修改資料。
為什麼要採用磁碟順序寫?
完成一次磁碟 IO,需要經過尋道、旋轉和資料傳輸三個步驟:
- 尋道(時間):磁頭移動定位到指定磁軌;
- 旋轉延遲(時間):等待指定扇區從磁頭下旋轉經過;
-
資料傳輸(時間):資料在磁碟、記憶體與網路之間的實際傳輸。
首先必須找到柱面,即磁頭需要移動對準相應磁軌,這個過程叫做尋道,所耗費時間叫做尋道時間,然後目標扇區旋轉到磁頭下,這個過程耗費的時間叫做旋轉時間。
怎麼樣才能提高磁碟的讀寫效率呢?
即採用磁碟順序寫,這樣就不需要尋道時間,只需很少的旋轉時間,將資料追加到檔案的末尾,不是在檔案的隨機位置來修改資料。
基於上面兩點,kafka 就實現了寫入資料的超高效能。
3、零複製
先來看看非零複製的情況,如下圖所示:
可以看到資料的複製從記憶體複製到 Kafka 服務程式那塊,又複製到 Socket 快取那塊,整個過程耗費的時間比較高。
Kafka 利用了 Linux 的 sendFile 技術(NIO),省去了程式切換和一次資料複製,讓效能變得更好,如下圖所示:
透過 零複製技術,就不需要把 os cache 裡的資料複製到應用快取,再從應用快取複製到 Socket 快取了,兩次複製都省略了,所以叫做零複製。
4、分割槽分段+索引
Kafka 的 message 是按 topic分 類儲存的,topic 中的資料又是按照一個一個的 partition 即分割槽儲存到不同 broker 節點。每個 partition 對應了作業系統上的一個資料夾,partition 實際上又是按照segment分段儲存的。
透過這種分割槽分段的設計,Kafka 的 message 訊息實際上是分散式儲存在一個一個小的 segment 中的,每次檔案操作也是直接操作的 segment。
為了進一步的查詢最佳化,Kafka 又預設為分段後的資料檔案建立了索引檔案,就是檔案系統上的.index檔案。這種分割槽分段+索引的設計,不僅提升了資料讀取的效率,同時也提高了資料操作的並行度。
以上
作者簡介
陳睿|mikechen,10年+大廠架構經驗,《BAT架構技術500期》系列文章作者,分享十餘年BAT架構經驗以及面試心得!
閱讀mikechen的網際網路架構更多技術文章合集
| | | | | | | 架構師
關注「mikechen 的網際網路架構」公眾號,回覆 【架構】領取我原創的《300 期 + BAT 架構技術系列與 1000 + 大廠面試題答案》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011997/viewspace-2915364/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kafka 效能篇:為何 Kafka 這麼快?Kafka
- Kafka 為什麼快Kafka
- Kafka為什麼速度那麼快?Kafka
- 為什麼Julia這麼快?
- Redis為什麼這麼快?Redis
- Nginx 為什麼這麼快?Nginx
- 快速排序為什麼這麼快?排序
- 硬核!15張圖解Redis為什麼這麼快圖解Redis
- Python為什麼會這麼火呢?原因是什麼?Python
- RocketMQ為什麼這麼快?我從原始碼中扒出了10大原因!MQ原始碼
- 為什麼要用Redis?Redis為什麼這麼快?(來自知乎)Redis
- MYSQL索引為什麼這麼快?瞭解索引的神奇之處MySql索引
- Redis 為什麼這麼快?這才是最完美的回答Redis
- 碾壓Python!為什麼Julia速度這麼快?Python
- [譯][A crash course in WebAssembly] 為什麼WebAssembly這麼快Web
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- Python為什麼發展這麼快速?原因很簡單!Python
- Kafka核心元件詳解Kafka元件
- 圖解|12張圖解釋MySQL主鍵查詢為什麼這麼快圖解MySql
- 為什麼V8引擎這麼快?
- 為什麼Redis這麼快?5分鐘成為Redis高手Redis
- 為什麼你學不好Web前端?這些原因你需瞭解Web前端
- kafka核心架構詳解Kafka架構
- Netty是什麼,Netty為什麼速度這麼快,執行緒模型分析Netty執行緒模型
- 比Redis快5倍的中介軟體,究竟為什麼這麼快?Redis
- redis是單執行緒的,為什麼這麼快Redis執行緒
- 為什麼用Vite框架?來看它的核心元件案例詳解Vite框架元件
- Redis為什麼那麼快?Redis
- redis為什麼快Redis
- 告訴你MySQL主鍵查詢為什麼這麼快MySql
- 為什麼那麼多人要學Java?這三個原因告訴你Java
- redis為什麼變慢了?這些原因你都知道嗎Redis
- Redis是單執行緒的,但Redis為什麼這麼快?Redis執行緒
- Kafka 學習筆記(一) :為什麼需要 Kafka?Kafka筆記
- Kafka 入門(三)--為什麼 Kafka 依賴 ZooKeeper?Kafka
- Kafka學習筆記(一) :為什麼需要Kafka?Kafka筆記
- codeforces 1461D,離線查詢是什麼神仙方法,為什麼快這麼多?
- 圖解|12張圖告訴你MySQL的主鍵查詢為什麼這麼快圖解MySql