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