1. 程式人生 > 實用技巧 >​網際網路企業都在用的Kafka為什麼可以這麼快?

​網際網路企業都在用的Kafka為什麼可以這麼快?

在資料為王的時代,對於海量資料的儲存、傳輸、分析變得尤為重要。在資料的儲存上有clickhouse、Hbase等大資料庫來完成,在資料的分析上一般也是藉助clickhouse或hbase的特性將資料分維度進行,而在資料的傳輸上,大家都不約而同使用了Kafka。高併發、高效能、快速成為了Kafka的代名詞。
在這裡插入圖片描述

Kafka+clickhouse+zookeeper成為了大資料分析處理行業的三件套,不過今天我們只聊Kafka,你所知道的一線大廠,如阿里、百度、騰訊、頭條、美團、滴滴等,均在Kafka上做了二次開發,集合業務擴充套件了它的能力,你所不知道的網際網路企業則利用了Kafka的原生能力來輔助做業務處理。那麼Kafka為什麼可以做到這麼快呢?今天我們就來聊一聊。

在第一點便是Kafka的特性,使用partition分割槽來做並行處理。Kafka作為一個釋出-訂閱系統,它所操作的最小單元便是topic主題訊息,而每一個topic可以劃分為多個partition。不同partition一般位於不同的機器中,利用叢集的優勢就可以實現機器間的並行處理。另外因為一個partition在機器上對應一個資料夾,即使存在多個partition位於同一個機器節點,也可以配置同一個機器節點的partition處於不同的磁碟,實現磁碟間的並行處理,提高速度。

第二點便是順序寫入磁碟,我們知道Kafka資料是儲存在磁碟上的,磁碟讀取資料的時間主要由尋道時間(正確的找到磁軌)、旋轉延遲(讀寫磁頭旋轉)、資料傳輸時間組成。如果磁碟是順序讀寫資料,磁頭只要找到正確的磁軌就可以不斷的旋轉獲取資料了,而如果磁碟是隨機讀寫資料,最差的情況每一份資料都在不同的磁軌上,那麼就需要每次尋道、旋轉磁頭,非常的耗時,效能也很差。在Kafka中每個分割槽的資料是有序的、不可變的訊息佇列,新的訊息來到分割槽就會追加在最末尾,順序寫的方式就提高了速度。當我們要去刪除資料的時候,也是通過把partition分為多個segment,直接刪除segment即可,也是非常的快。

第三點是利用pagecache。我們知道Kafka一般都是裝在Linux系統使用的,在Linux系統的設計中,為了提高對磁碟訪問的效能,將檔案的cache分為pagecache、buffercache兩部分,在pagecache模組快取檔案系統的資料,支援程序對檔案的讀寫,在buffercache快取塊資料,支援系統對塊裝置的讀寫。在Kafka中,伺服器節點broker收到資料後,在寫磁碟時把資料寫入pagecache,把連續的小塊組裝成大塊的物理寫提高了效能,在讀磁碟資料時從pagecache讀,不通過物理磁盤獲取,提高了速度。
第四點是Kafka的零拷貝機制。我們知道作業系統的核心是核心,為了避免使用者直接操作核心,作業系統一般把核心劃分成兩部分,即核心空間、使用者空間。在Linux系統中,讀取資料操作都是基於資料拷貝完成的,也就是說資料會在核心地址空間的緩衝區和使用者地址空間的緩衝區進行拷貝,正常的資料讀取流程一般包含四部分。

1、作業系統需要先從磁盤裡讀取檔案到核心頁面的快取;
2、使用者態的應用程式從核心態讀取資料到使用者空間快取區,由於核心態的資源比較寶貴會經常釋放;
3、使用者態的應用程式還需要將資料寫回核心空間並放入socket緩衝區;
4、最後作業系統將資料從socket緩衝區複製到網絡卡介面,再經由網路傳送給到消費者程序。
在消費者consumer讀取Kafka訊息佇列的資料時,按理說也要經過這四次copydata的流程,但是Kafka內建了零拷貝技術,將磁碟檔案的資料複製到頁面快取中,然後將資料從頁面快取直接傳送到網路給到不同的訂閱者,避免了重複拷貝操作,極大的提高了速度。
第五點是壓縮批處理。在Kafka的producer往broker伺服器節點發送資料時,會累積多條訊息壓縮後一起傳送,通過批處理和壓縮的方式提高了速度,也提高了網路頻寬使用率。