互聯網企業都在用的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服務器節點發送數據時,會累積多條消息壓縮后一起發送,通過批處理和壓縮的方式提高了速度,也提高了網絡帶寬使用率。
通過本文的介紹,你對Kafka的速度了解了嗎?在日常技術開發或者業務選型當中,Kafka無疑都是你最好的選擇噢。在金九銀十的面試中,如果面試官問你用什么消息隊列或者你對消息隊列有什么了解時,把這些知識點咔咔講出來,直接讓面試官眼前一亮,最佳候選人說不定就是你了~加油鴨!