Java中的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文件。這種分區分段+索引的設計,不僅提升瞭數據讀取的效率,同時也提高瞭數據操作的並行度。

到此這篇關於Java中的Kafka為什麼性能這麼快及4大核心詳析的文章就介紹到這瞭,更多相關Java Kafka內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: