深入理解Kafka設計:高效能伺服器模型(1)
版權宣告:本文為博主原創文章,未經博主允許不得轉載。
摘要
Kafka作為一個高效能的訊息中介軟體,其高效的原因可以歸納為以下這幾個方面:
- 高效能伺服器模型
- PageCache
- Zero-Copy
本文將從原始碼層面(基於0.8.2.X)介紹Broker的高效能伺服器模型是如何實現的。
高效能伺服器模型
Kafka並沒有採用netty或mina等第三方網路應用框架,而是直接了當的使用了NIO來實現伺服器,並在使用了IO多路複用以及多執行緒Reactor模式,這種設計的優勢是很容易實現,同時也很快。
官方並沒有在伺服器設計上詳細展開,因此本文將從邏輯結構和原始碼方面來分析這個方面的設計,藉此瞭解一下NIO伺服器設計的方法及一些細節。
SocketServer作為Kafka的NIO伺服器實現,其邏輯結構圖如下:
重要元件
Acceptor執行緒:主要負責監聽並接受客戶端(包括但不限於Producer,Consumer,Broker,Controller,AdminTool)的連線請求,新連線建立以後指定某個Processor去處理。
-
Processor執行緒:負責資料讀寫,連線關閉的處理執行緒,其數目由配置num.network.threads決定,預設是3個。每個Processor內部都有自己的newConnections佇列和selector。
- newConnections:一個無界的SocketChannel佇列,存放新建立的連線,將Acceptor與Processor的功能解藕。
- selector:只使用一個selector來支撐大量連線的事件管理很容易遇到瓶頸,而多個selector並存的結構可以均衡的管理大量連線。
-
RequestChannel:包含一個RequestQueue和多個ResponseQueue。它是網路層與API層交換資料的地方,同時也使得兩者邏輯解藕和非同步化。
- RequestQueue:所有的請求都會被封裝成Request並放入RequestQueue中,佇列大小預設500。
- ResponseQueue:每個Processor都會有對應ResponseQueue,KafkaApis業務邏輯處理完成後,會將返回結果封裝成Response,接著由相應的Processor來處理該response。而且設計上必須保證一對Request和Response都要由同一個Processor來處理,因為只有這個Processor擁有該通訊連線。
KafkaRequestHandler執行緒:這是真正的業務邏輯處理執行緒,其數目由配置num.io.threads決定,預設是8個。每個Handler執行緒都在不斷的從RequestChannel.RequestQueue中獲取新的請求,那些負載輕的執行緒才有可能搶到新的請求,因為負載重的執行緒(也許正在進行IO)還沒有空閒來接受下一個新的請求,所以這也算一個潛在的負載均衡策略吧。
KafkaApis:Broker的所有業務邏輯都定義在這裡,其handle方法會根據Request物件的requestId(對應各種業務邏輯,其定義可以在類RequestKeys中看到),將請求分發給對應的業務邏輯處理方法。當處理完成以後,可能會將處理結果封裝成Response返回給對應的RequestChannel.ResponseQueue。
總結
這一節主要是從總體上介紹了Broker伺服器模型的各種重要的元件,下一節我們將結合原始碼分析一下請求處理的流程:
深入理解Kafka設計:高效能伺服器模型(2)
相關文章
- 深入理解Kafka核心設計及原理(二):生產者Kafka
- 深入理解Kafka核心設計及原理(三):消費者Kafka
- 深入理解Kafka核心設計及原理(四):主題管理Kafka
- Kafka 概述:深入理解架構Kafka架構
- 深入理解 Kafka 副本機制Kafka
- 深入理解Moya設計
- 理解高效能網路模型模型
- 深入理解JVM(1)之--JVM記憶體模型JVM記憶體模型
- MVC設計模式深入理解MVC設計模式
- 深入理解 dbt 增量模型模型
- 深入理解TCP/IP模型TCP模型
- 深入理解併發程式設計藝術之計算機記憶體模型程式設計計算機記憶體模型
- 深入理解模組化程式設計程式設計
- 深入理解Java I/O模型Java模型
- 深入理解盒模型與BFC模型
- 高效能KafkaKafka
- 伺服器程式設計——高效能伺服器程式框架伺服器程式設計框架
- 高效能伺服器的分散式設計伺服器分散式
- java 23種設計模式 深入理解Java設計模式
- 盒模型-深入理解盒模型及相關概念模型
- 深入理解javascript系列(十二):函式與函數語言程式設計(1)JavaScript函式函數程式設計
- 深入理解OkHttp原始碼及設計思想HTTP原始碼
- 深入理解函數語言程式設計函數程式設計
- 深入理解Javascript物件導向程式設計JavaScript物件程式設計
- 深入理解多執行緒程式設計執行緒程式設計
- 高效能網路程式設計-反應堆模型(reactor)程式設計模型React
- 深入理解Java的分級引用模型Java模型
- 深入理解 RxJava 的執行緒模型RxJava執行緒模型
- 深入理解F1-score
- 深入理解Plasma(1):Plasma 框架ASM框架
- 深入剖析KafkaKafka
- Java併發程式設計,深入理解ReentrantLockJava程式設計ReentrantLock
- 從程式設計師的角度深入理解MySQL程式設計師MySql
- Java併發程式設計——深入理解自旋鎖Java程式設計
- 深入理解 Python 非同步程式設計(上)Python非同步程式設計
- 伺服器端程式設計之 IO 模型伺服器程式設計模型
- 深入理解 PHP 高效能框架 Workerman 守護程序原理PHP框架
- 深入理解計算機系統-學習筆記 (1)計算機筆記