1. Reactor 模式分類
a. 單 Reactor 單線程;
b. 單 Reactor 多線程;
c. 主從 Reactor 多線程;
1.1. Reactor 模式具有如下的優點:
1. 響應快,不必為單個同步時間所阻塞,雖然 Reactor 本身依然是同步的
2. 可以最大程度的避免復雜的多線程及同步問題,並且避免了多線程/進程的切換開銷
3. 擴展性好,可以方便的通過增加 Reactor 實例個數來充分利用 CPU 資源 復用性好,
4. Reactor 模型本身與具體事件處理邏輯無關,具有很高的復用性
2.單 Reactor 單線程
2.1. 工作原理示意圖:
說明:
1. Select 是前面 I/O 復用模型介紹的標准網絡編程 API,可以實現應用程序通過一個阻塞對象監聽多路連接請求
2. Reactor 對象通過 Select 監控客戶端請求事件,收到事件后通過 Dispatch 進行分發 如果是建立連接請求事件,則由 Acceptor 通過 Accept 處理連接請求,
然后創建一個 Handler 對象處理連接完成后的后續業務處理
3.如果不是建立連接事件,則 Reactor 會分發調用連接對應的 Handler 來響應
4.Handler 會完成 Read→業務處理→Send 的完整業務流程
2.2. 方案優缺點分析:
優點:模型簡單,沒有多線程、進程通信、競爭的問題,全部都在一個線程中完成
缺點:
a. 性能問題,只有一個線程,無法完全發揮多核 CPU 的性能。Handler 在處理某個連接上的業務時,整個進程無法處理其他連接事件,很容易導致性能瓶頸;
b. 可靠性問題,線程意外終止,或者進入死循環,會導致整個系統通信模塊不可用,不能接收和處理外部消息,造成節點故障;
2.3. 使用場景:
客戶端的數量有限,業務處理非常快速,比如 Redis在業務處理的時間復雜度 O(1) 的情況
3. 單Reactor多線程
3.1. 工作原理示意圖:
方案說明:
a. Reactor 對象通過select 監控客戶端請求事件, 收到事件后,通過dispatch進行分發
b. 如果建立連接請求, 則Acceptor 通過accept 處理連接請求, 然后創建一個Handler對象處理完成連接后的各種事件
c. 如果不是連接請求,則由reactor分發調用連接對應的handler 來處理
d. handler 只負責響應事件,不做具體的業務處理, 通過read 讀取數據后,會分發給后面的worker線程池的某個線程處理業務
e. worker 線程池會分配獨立線程完成真正的業務,並將結果返回給handler
f. handler收到響應后,通過send 將結果返回給client
3.2. 方案優缺點分析
優點:可以充分的利用多核cpu 的處理能力
缺點:多線程數據共享和訪問比較復雜, reactor 處理所有的事件的監聽和響應,在單線程運行, 在高並發場景容易出現性能瓶頸.
4. 主從 Reactor 多線程
4.1. 工作原理示意圖:
4.1.1 方案說明:
1. Reactor主線程 MainReactor 對象通過select 監聽連接事件, 收到事件后,通過Acceptor 處理連接事件
2. 當 Acceptor 處理連接事件后,MainReactor 將連接分配給SubReactor
3. subreactor 將連接加入到連接隊列進行監聽,並創建handler進行各種事件處理
4.當有新事件發生時, subreactor 就會調用對應的handler處理
5. handler 通過read 讀取數據,分發給后面的worker 線程處理
6.worker 線程池分配獨立的worker 線程進行業務處理,並返回結果
7. handler收到響應的結果后,再通過send 將結果返回給client
8. Reactor主線程可以對應多個Reactor 子線程, 即MainRecator 可以關聯多個SubReactor
4.1.2. 方案優缺點說明:
優點:父線程與子線程的數據交互簡單職責明確,父線程只需要接收新連接,子線程完成后續的業務處理。
缺點:編程復雜度較高
注釋:本文資源來自B站韓順平講師,表示感謝!