Reactor 模式-3 種典型實現


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站韓順平講師,表示感謝!

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM