我們直到Kafka是一個自稱高性能的消息隊列引擎,一般來說對于中間件的設(shè)計需要從計算、存儲、網(wǎng)絡(luò)三方面進行下手,而消息從產(chǎn)生到消費,也會經(jīng)歷多個流程,比如在生產(chǎn)者端采用異步\同步方式發(fā)送,采用高效的壓縮算法,高效的序列化方式,以及網(wǎng)絡(luò)IO等。那么Kafka主要實現(xiàn)高性能IO的。
批量消息發(fā)送
我們直到通過send方法,不管是同步還是異步方式,消息都會直接先暫存到內(nèi)存中,然后等夠一批數(shù)據(jù)消息后,才會發(fā)送到broker端,而Broker端不會將消息進行拆解,而是按照一個批量消息為一個單位進行處理,我們假設(shè)處理一個單條消息到Broker端需要1ms,那么需要1S中最多處理1000個消息,但是如果是批量發(fā)送,那么1S中處理的消息肯定是對于1000個消息的。因為這個途中會涉及本地IO、網(wǎng)絡(luò)IO、數(shù)據(jù)拷貝等。
構(gòu)建批消息和解開批消息分別在發(fā)送端和消費端的客戶端完成,不僅減輕了 Broker 的壓力,最重要的是減少了 Broker 處理請求的次數(shù),提升了總體的處理能力。
順序讀寫提升磁盤 IO 性能
我們直到磁盤順序讀寫要比隨機讀寫速度快很多,最根本的是可以減少尋址操作。
Kafka也利用這個順序讀寫的機制,來提升IO性能,在消息發(fā)送到Broker的時候,會按照分區(qū) 將消息順序?qū)懙絃og文件中,而消費者在消費的時候,也是按照log文件進行讀。當(dāng)一個文件寫完或者讀完就會生成下一個文件。
充分利用了順序讀寫這個特性,極大提升了 Kafka 在使用磁盤時的 IO 性能。
PageCache 加速消息讀寫
在 Kafka 中,它會利用 PageCache 加速消息讀寫。PageCache 是現(xiàn)代操作系統(tǒng)都具有的一項基本特性。通俗地說,PageCache 就是操作系統(tǒng)在內(nèi)存中給磁盤上的文件建立的緩存。無論我們使用什么語言編寫的程序,在調(diào)用系統(tǒng)的 API 讀寫文件的時候,并不會直接去讀寫磁盤上的文件,應(yīng)用程序?qū)嶋H操作的都是 PageCache,也就是文件在內(nèi)存中緩存的副本。
寫數(shù)據(jù)流程,應(yīng)用程序在寫入數(shù)據(jù)的時候,先將數(shù)據(jù)寫入到PageCache中,然后在一批批寫入到磁盤中。
讀數(shù)據(jù)流程,一個是pageCache中有數(shù)據(jù),直接返回。沒有數(shù)據(jù)從磁盤中讀取到數(shù)據(jù)后,寫入到pageCahce中,這個之后從pageCache讀取數(shù)據(jù)。
數(shù)據(jù)淘汰算法,采用LRU 可以將最近寫入的數(shù)據(jù),提升讀的能力。
Kafka 在讀寫消息文件的時候,充分利用了 PageCache 的特性。一般來說,消息剛剛寫入到服務(wù)端就會被消費,按照 LRU 的“優(yōu)先清除最近最少使用的頁”這種策略,讀取的時候,對于這種剛剛寫入的 PageCache,命中的幾率會非常高。
也就是說,大部分情況下,消費讀消息都會命中 PageCache,帶來的好處有兩個:一個是讀取的速度會非??欤硗庖粋€是,給寫入消息讓出磁盤的 IO 資源,間接也提升了寫入的性能
ZeroCopy:零拷貝技術(shù)
我們直到服務(wù)端Broker在處理消費時候,會先從磁盤上讀取數(shù)據(jù),如果命中pageCache的話 直接返回,然后將數(shù)據(jù)讀取到應(yīng)用程序中,通過網(wǎng)絡(luò)socket發(fā)送出去。
未使用零拷貝
- 先從磁盤讀取數(shù)據(jù),如果數(shù)據(jù)在pageCache中返回,沒有從磁盤讀取。寫入到用戶緩沖區(qū)。然后將用戶緩沖區(qū)數(shù)據(jù)寫到socket緩沖區(qū),最后寫到網(wǎng)卡緩沖區(qū)。
使用零拷貝
從圖中可以得知 可以把數(shù)據(jù)直接從pageCache中寫到Socke緩沖區(qū)中,減少1/2次數(shù)據(jù)拷貝的過程,而這就是DMA技術(shù),文章來源:http://www.zghlxwxcb.cn/news/detail-412115.html
小結(jié)
本篇主要介紹了Kafka的高性能IO設(shè)計,其實本質(zhì)上都是從計算、存儲、網(wǎng)絡(luò)三個方面進行入手。而高性能的目的是實現(xiàn)高吞吐量,以及提升系統(tǒng)的并發(fā)容量。而高可用則是避免出現(xiàn)單點故障,通過服務(wù)冗余、分片、分區(qū)等方式實現(xiàn)系統(tǒng)的可用。文章來源地址http://www.zghlxwxcb.cn/news/detail-412115.html
到了這里,關(guān)于【消息隊列】Kafka如何實現(xiàn)高性能IO的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!