1. 程式人生 > >Reactor和Proactor對比以及優缺點(netty的底層原理reactor模型)

Reactor和Proactor對比以及優缺點(netty的底層原理reactor模型)

轉自:https://blog.csdn.net/wanbf123/article/details/78062802 

IO設計模式:Reactor和Proactor 
平時接觸的開源產品如Redis、ACE,事件模型都使用的Reactor模式;而同樣做事件處理的Proactor,由於作業系統的原因,相關的開源產品也少;這裡學習下其模型結構,重點對比下兩者的異同點;

反應器Reactor
Reactor模式結構


Reactor包含如下角色:

Handle 控制代碼;用來標識socket連線或是開啟檔案;
Synchronous Event Demultiplexer:同步事件多路分解器:由作業系統核心實現的一個函式;用於阻塞等待發生在控制代碼集合上的一個或多個事件;(如select/epoll)


Event Handler:事件處理介面
Concrete Event HandlerA:實現應用程式所提供的特定事件處理邏輯;
Reactor:反應器,定義一個介面,實現以下功能: 
1)供應用程式註冊和刪除關注的事件控制代碼; 
2)執行事件迴圈; 
3)有就緒事件到來時,分發事件到之前註冊的回撥函式上處理;

“反應”器名字中”反應“的由來: 
“反應”即“倒置”,“控制逆轉”,具體事件處理程式不呼叫反應器,而是由反應器分配一個具體事件處理程式,具體事件處理程式對某個指定的事件發生做出反應;這種控制逆轉又稱為“好萊塢法則”(不要呼叫我,讓我來呼叫你)

業務流程及時序圖


應用啟動,將關注的事件handle註冊到Reactor中;
呼叫Reactor,進入無限事件迴圈,等待註冊的事件到來;
事件到來,select返回,Reactor將事件分發到之前註冊的回撥函式中處理;

主動器Proactor 

Proactor模式結構


Proactor主動器模式包含如下角色

Handle 控制代碼;用來標識socket連線或是開啟檔案;
Asynchronous Operation Processor:非同步操作處理器;負責執行非同步操作,一般由作業系統核心實現;
Asynchronous Operation:非同步操作
Completion Event Queue:完成事件佇列;非同步操作完成的結果放到佇列中等待後續使用


Proactor:主動器;為應用程式程序提供事件迴圈;從完成事件佇列中取出非同步操作的結果,分發呼叫相應的後續處理邏輯;
Completion Handler:完成事件介面;一般是由回撥函式組成的介面;
Concrete Completion Handler:完成事件處理邏輯;實現介面定義特定的應用處理邏輯;

業務流程及時序圖


應用程式啟動,呼叫非同步操作處理器提供的非同步操作介面函式,呼叫之後應用程式和非同步操作處理就獨立執行;應用程式可以呼叫新的非同步操作,而其它操作可以併發進行;
應用程式啟動Proactor主動器,進行無限的事件迴圈,等待完成事件到來;
非同步操作處理器執行非同步操作,完成後將結果放入到完成事件佇列;
主動器從完成事件佇列中取出結果,分發到相應的完成事件回撥函式處理邏輯中;

對比兩者的區別

主動和被動
以主動寫為例: 
Reactor將handle放到select(),等待可寫就緒,然後呼叫write()寫入資料;寫完處理後續邏輯; 
Proactor呼叫aoi_write後立刻返回,由核心負責寫操作,寫完後呼叫相應的回撥函式處理後續邏輯;

可以看出,Reactor被動的等待指示事件的到來並做出反應;它有一個等待的過程,做什麼都要先放入到監聽事件集合中等待handler可用時再進行操作; 
Proactor直接呼叫非同步讀寫操作,呼叫完後立刻返回;

實現
Reactor實現了一個被動的事件分離和分發模型,服務等待請求事件的到來,再通過不受間斷的同步處理事件,從而做出反應;

Proactor實現了一個主動的事件分離和分發模型;這種設計允許多個任務併發的執行,從而提高吞吐量;並可執行耗時長的任務(各個任務間互不影響)

優點
Reactor實現相對簡單,對於耗時短的處理場景處理高效; 
作業系統可以在多個事件源上等待,並且避免了多執行緒程式設計相關的效能開銷和程式設計複雜性; 
事件的序列化對應用是透明的,可以順序的同步執行而不需要加鎖; 
事務分離:將與應用無關的多路分解和分配機制和與應用相關的回撥函式分離開來,

Proactor效能更高,能夠處理耗時長的併發場景;

缺點
Reactor處理耗時長的操作會造成事件分發的阻塞,影響到後續事件的處理;

Proactor實現邏輯複雜;依賴作業系統對非同步的支援,目前實現了純非同步操作的作業系統少,實現優秀的如windows IOCP,但由於其windows系統用於伺服器的侷限性,目前應用範圍較小;而Unix/Linux系統對純非同步的支援有限,應用事件驅動的主流還是通過select/epoll來實現;

適用場景
Reactor:同時接收多個服務請求,並且依次同步的處理它們的事件驅動程式; 
Proactor:非同步接收和同時處理多個服務請求的事件驅動程式;