Kafka是大數(shù)據(jù)領域無處不在的消息中間件,目前廣泛使用在企業(yè)內部的實時數(shù)據(jù)管道,并幫助企業(yè)構建自己的流計算應用程序。Kafka雖然是基于磁盤做的數(shù)據(jù)存儲,但卻具有高性能、高吞吐、低延時的特點,其吞吐量動輒幾萬、幾十上百萬。但是很多使用過Kafka的人,經常會被問到這樣一個問題,Kafka為什么速度快,吞吐量大;大部分被問的人都是一下子就懵了,或者是只知道一些簡單的點,本文就簡單的介紹一下Kafka為什么速度快,吞吐量大。
10余年的鼓樓網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網絡營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調整鼓樓建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“鼓樓網站設計”,“鼓樓網站推廣”以來,每個客戶項目都認真落實執(zhí)行。
眾所周知Kafka是將消息記錄持久化到本地磁盤中的,一般人會認為磁盤讀寫性能差,可能會對Kafka性能如何保證提出質疑。實際上不管是內存還是磁盤,快或慢關鍵在于尋址的方式,磁盤分為順序讀寫與隨機讀寫,內存也一樣分為順序讀寫與隨機讀寫。基于磁盤的隨機讀寫確實很慢,但磁盤的順序讀寫性能卻很高,一般而言要高出磁盤隨機讀寫三個數(shù)量級,一些情況下磁盤順序讀寫性能甚至要高于內存隨機讀寫,這里給出著名學術期刊 ACM Queue 上的一張性能對比圖:
磁盤的順序讀寫是磁盤使用模式中最有規(guī)律的,并且操作系統(tǒng)也對這種模式做了大量優(yōu)化,Kafka就是使用了磁盤順序讀寫來提升的性能。Kafka的message是不斷追加到本地磁盤文件末尾的,而不是隨機的寫入,這使得Kafka寫入吞吐量得到了顯著提升 。
為了優(yōu)化讀寫性能,Kafka利用了操作系統(tǒng)本身的Page Cache,就是利用操作系統(tǒng)自身的內存而不是JVM空間內存。這樣做的好處有:
相比于使用JVM或in-memory cache等數(shù)據(jù)結構,利用操作系統(tǒng)的Page Cache更加簡單可靠。首先,操作系統(tǒng)層面的緩存利用率會更高,因為存儲的都是緊湊的字節(jié)結構而不是獨立的對象。其次,操作系統(tǒng)本身也對于Page Cache做了大量優(yōu)化,提供了 write-behind、read-ahead以及flush等多種機制。再者,即使服務進程重啟,系統(tǒng)緩存依然不會消失,避免了in-process cache重建緩存的過程。
通過操作系統(tǒng)的Page Cache,Kafka的讀寫操作基本上是基于內存的,讀寫速度得到了極大的提升。
這里主要講的是Kafka利用 linux 操作系統(tǒng)的 “零拷貝(zero-copy)” 機制在消費端做的優(yōu)化。首先來了解下數(shù)據(jù)從文件發(fā)送到socket網絡連接中的常規(guī)傳輸路徑:
這個過程包含4次copy操作和2次系統(tǒng)上下文切換,性能其實非常低效。linux操作系統(tǒng) “零拷貝” 機制使用了sendfile方法, 允許操作系統(tǒng)將數(shù)據(jù)從Page Cache 直接發(fā)送到網絡,只需要最后一步的copy操作將數(shù)據(jù)復制到 NIC 緩沖區(qū), 這樣避免重新復制數(shù)據(jù) 。示意圖如下:

通過這種 “零拷貝” 的機制,Page Cache 結合 sendfile 方法,Kafka消費端的性能也大幅提升。這也是為什么有時候消費端在不斷消費數(shù)據(jù)時,我們并沒有看到磁盤io比較高,此刻正是操作系統(tǒng)緩存在提供數(shù)據(jù)。
Kafka的message是按topic分類存儲的,topic中的數(shù)據(jù)又是按照一個一個的partition即分區(qū)存儲到不同broker節(jié)點。每個partition對應了操作系統(tǒng)上的一個文件夾,partition實際上又是按照segment分段存儲的。這也非常符合分布式系統(tǒng)分區(qū)分桶的設計思想。
通過這種分區(qū)分段的設計,Kafka的message消息實際上是分布式存儲在一個一個小的segment中的,每次文件操作也是直接操作的segment。為了進一步的查詢優(yōu)化,Kafka又默認為分段后的數(shù)據(jù)文件建立了索引文件,就是文件系統(tǒng)上的.index文件。這種分區(qū)分段+索引的設計,不僅提升了數(shù)據(jù)讀取的效率,同時也提高了數(shù)據(jù)操作的并行度。
Kafka采用順序讀寫、Page Cache、零拷貝以及分區(qū)分段等這些設計,再加上在索引方面做的優(yōu)化,另外Kafka數(shù)據(jù)讀寫也是批量的而不是單條的,使得Kafka具有了高性能、高吞吐、低延時的特點。這樣,Kafka提供大容量的磁盤存儲也變成了一種優(yōu)點。
網站標題:kafka作為流式處理的上一層,為什么吞吐量那么大?
文章轉載:http://chinadenli.net/article42/phophc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、App設計、外貿網站建設、微信公眾號、網站內鏈、手機網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)