您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Kafka為什么會這么快呢,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在系統設計中,會用到消息中間件來做服務異步化,系統解耦,或者是做流量削峰,常用的消息中間件有rabbitMq,activeMq以及阿里的RocketMq等等,都各自有各自的優勢,但是就吞吐量來說,kafka是其中的佼佼者。在單機情況下,網友做的對比如下:
為什么kafka會這么快呢?
發布訂閱模式
一個普通的發布訂閱模型如下圖所示:
以kafka為例,生產者產生消息,并將消息Push到kafka集群,消費者主動去kafka集群Pull數據。這種模型有個好處,消費的速率完全由消費者控制,kafka集群類似于一個蓄水池,避免因生產者產生消息過快消費者來不及消費而導致消費者被壓垮的現象。
kafka為什么快要從兩方面分析,生產者產生的消息寫入集群時快和消費者消費消息時從集群讀取快。
寫入快
寫入快主要是兩方面原因:順序寫入和MMFile。
順序寫入
kafka將消息存儲在硬盤,通常認為硬盤的讀寫是比較慢,但是為什么kafka快呢?平時所說的磁盤讀寫慢是指隨機讀寫比較慢,因為磁盤每次隨機讀寫都要物理尋址,這是非常耗時的操作,順序讀寫的速度還是比較快的。如下圖所示:
kafka每次收到新的消息之后都會將消息存儲在尾部,按照順序存儲消息。但是消息一旦存儲無法刪除。
當消費者消費時也是順序消費,每個消費者會有一個偏移量,記錄當前消費的消息的位置。如下圖所示:
MMFile
MMFile是指Memory Mapped Files,即內存映射技術。操作系統為了解決內存和硬盤讀寫速度之間的差異,采用了內存映射技術,內存被劃分為若干頁,每一頁被映射到一塊磁盤空間,因為內存是遠遠小于磁盤空間的,所以分頁經常會按照一定的算法加載到內存,例如先進先出(FIFO),最近最少使用(LRU)等。內存中分頁和磁盤空間對應,操作系統會在合適的時候將內存分頁中的數據定時刷磁盤中去。這種方式為什么可以提高寫入效率呢?通常CPU執行過程中為了安全分為內核態和用戶態。只有內核態才能操作iO設備,內存空間分為內核空間和用戶空間。通常內存中的數據寫入到磁盤要以下幾步:
數據會先從用戶空間拷貝到內核空間,然后再由內核空間寫入IO設備。而MMFile則省去了一次用數據從戶空間到內核空間復制的開銷。
讀取快
讀取快主要是因為零拷貝(Zero Copy)技術。上面介紹到數據從內存空間寫入磁盤的步驟,那么從磁盤讀取數據剛好相反,具體過程如下:
數據先從磁盤讀取到內核空間,然后再從內核空間復制到用戶空間,然后再到Socket,最后傳輸到消費者。
Linux提供了一種sendFile系統調用,可以將數據直接由磁盤拷貝到內核空間。省去了一次數據從用戶空間到內核空間的復制。這就是所謂的零拷貝技術。
上面從讀寫兩個角度分析了為什么kafka吞吐量高,其實還有一個重要的原因。
批量數據壓縮
kafka不會對每個消息都做壓縮,而是對一批消息壓縮,然后將數據統一發送。將所有的消息變為一個批量文件,然后直接丟給消費者。
以上就是Kafka為什么會這么快呢,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。