高并發(fā)場(chǎng)景下,Kafka如何扛住百萬(wàn)級(jí)請(qǐng)求?
Kafka是大型架構(gòu)的必備中間件,也是大廠(chǎng)必備技能,下面我就重點(diǎn)詳解高并發(fā)場(chǎng)景下,Kafka實(shí)現(xiàn)高并發(fā)的關(guān)鍵技術(shù)@mikechen
Kafka架構(gòu)設(shè)計(jì)
Kafka 通過(guò)分布式架構(gòu)、分區(qū)機(jī)制、以及集群管理,實(shí)現(xiàn)了高并發(fā)性能。
Kafka 架構(gòu),由多個(gè) Broker(服務(wù)器節(jié)點(diǎn))組成,每個(gè) Broker 負(fù)責(zé)存儲(chǔ)、和管理部分消息。
整體架構(gòu),如下圖所示:
圖片
其中,Topic 分區(qū)(Partitioning) 是 Kafka 分布式設(shè)計(jì)的核心,它將消息分散存儲(chǔ)在不同節(jié)點(diǎn)上。
Kafka 支持水平擴(kuò)展,可以通過(guò)增加 Broker 節(jié)點(diǎn),來(lái)提升系統(tǒng)的容量和性能。
新增的 Broker 會(huì)自動(dòng)參、與分區(qū)的存儲(chǔ)和管理,分擔(dān)原有節(jié)點(diǎn)的壓力。
例如:一個(gè)擁有 10 個(gè)分區(qū)的主題,理論上可以支持 10 倍于單分區(qū)主題的并發(fā)讀寫(xiě)操作。
所以,分區(qū)使得 Kafka 天然支持并行處理,大大提升了系統(tǒng)的并發(fā)能力。
Kafka高并發(fā)關(guān)鍵技術(shù)
Kafka 之所以能夠?qū)崿F(xiàn)高吞吐量、和低延遲的消息處理,其核心設(shè)計(jì)還有是磁盤(pán)順序?qū)懀⊿equential Disk Writes)。
圖片
磁盤(pán)順序?qū)懀褐傅氖窃诖疟P(pán)上按照順序依次寫(xiě)入數(shù)據(jù),而不是隨機(jī)地在不同位置寫(xiě)入。
傳統(tǒng)的機(jī)械硬盤(pán)由盤(pán)片、磁頭臂、磁頭等部件組成,數(shù)據(jù)存儲(chǔ)在盤(pán)片的不同磁道和扇區(qū)上。
當(dāng)進(jìn)行隨機(jī)寫(xiě)操作時(shí),磁頭需要頻繁地移動(dòng)到不同的位置,這個(gè)過(guò)程涉及尋道和旋轉(zhuǎn)延遲,會(huì)極大地影響寫(xiě)入性能。
而順序?qū)憰r(shí),磁頭可以沿著一個(gè)方向連續(xù)地寫(xiě)入數(shù)據(jù),減少了尋道和旋轉(zhuǎn)延遲,從而提高了寫(xiě)入效率。
Kafka正是利用了這一點(diǎn),極大的提升了數(shù)據(jù)寫(xiě)入性能。
├── 00000000000000000000.log // 活躍的日志段(順序?qū)懭耄?├── 00000000000000000000.indexKafka 通過(guò)將消息,順序追加(Append)到日志文件末尾,充分利用了這一特性,從而,避免了隨機(jī)尋址的開(kāi)銷(xiāo)。
零拷貝
零拷貝(Zero-Copy)是一種計(jì)算機(jī)技術(shù),其核心目標(biāo)是減少、或消除數(shù)據(jù),在傳輸過(guò)程中的拷貝。
在傳統(tǒng)的數(shù)據(jù)傳輸過(guò)程中,數(shù)據(jù)通常需要在用戶(hù)空間(User Space)、和內(nèi)核空間(Kernel Space)之間多次拷貝。
如下圖所示:
圖片
首先,數(shù)據(jù)從磁盤(pán)讀取到內(nèi)核空間的緩沖區(qū)。
其次,內(nèi)核空間的緩沖區(qū),將數(shù)據(jù)復(fù)制到用戶(hù)空間的緩沖區(qū)。
然后,用戶(hù)空間的緩沖區(qū),再將數(shù)據(jù)寫(xiě)入到網(wǎng)絡(luò)接口、或其他輸出設(shè)備。
這種多步復(fù)制,會(huì)消耗大量 CPU 資源,并增加延遲。
而零拷貝技術(shù),通過(guò)優(yōu)化數(shù)據(jù)傳輸路徑,減少數(shù)據(jù)在用戶(hù)空間和內(nèi)核空間之間的多次拷貝,
比如:通過(guò)Linux的mmap() 系統(tǒng)調(diào)用,可以將文件或設(shè)備的內(nèi)存空間,映射到用戶(hù)空間的地址空間。
然后,應(yīng)用程序可以像訪(fǎng)問(wèn)內(nèi)存一樣直接訪(fǎng)問(wèn)文件內(nèi)容;
接著,使用 write() 系統(tǒng)調(diào)用將數(shù)據(jù)從用戶(hù)空間的緩沖區(qū)發(fā)送到網(wǎng)絡(luò)套接字。
在這個(gè)過(guò)程中,避免了從內(nèi)核緩沖區(qū)、到用戶(hù)空間緩沖區(qū)、再到內(nèi)核套接字緩沖區(qū)的兩次拷貝。
所以,減少了數(shù)據(jù)在不同存儲(chǔ)區(qū)域之間的移動(dòng)次數(shù),提高了數(shù)據(jù)傳輸?shù)耐掏铝?,也提升了并發(fā)性能。


































