天天看點

Java程式設計之:Reactor模型

作者:頑石九變

說明

1)Reactor模型,是基于事件驅動的,通過一個或多個輸入同時傳遞給服務端處理

2)服務端程式處理傳入的多個請求,并分發到相應的處理線程

3)基于I/O多路複用模型:多個連接配接共用一個阻塞對象,應用程式隻需在一個阻塞對象等待,無需阻塞等待所有連接配接。當某個連接配接有新的資料可以處理時,作業系統通知應用程式,線程從阻塞狀态傳回,開始進行業務處理

4)基于線程池複用線程資源:不必為每個連接配接建立線程,将連接配接完成後的業務處理任務配置設定給線程池進行處理,一個線程可以處理多個連接配接的業務

一、單Reactor單線程

1)可以實作通過一個阻塞對象監聽多個連結請求

2)Reactor對象通過select監聽用戶端請求事件,通過dispatch進行分發

3)如果是建立連結請求,則由Acceptor通過accept處理連結請求,然後建立一個Handler對象處理完成連結後的各種事件

4)如果不是連結請求,則由Reactor分發調用連結對應的Handler來處理

5)Handler會完成Read->業務處理->send的完整業務流程

Java程式設計之:Reactor模型

二、單Reactor多線程

1)Reactor對象通過select監聽用戶端請求事件,收到事件後,通過dispatch分發

2)如果是建立連結請求,則由Acceptor通過accept處理連結請求,然後建立一個Handler對象處理完成連結後的各種事件

3)如果不是連結請求,則由Reactor分發調用連結對應的Handler來處理

4)Handler隻負責事件響應不做具體業務處理

5)通過read讀取資料後,分發到worker線程池處理,處理完成後傳回給Handler,Handler收到後,通過send将結果傳回給client

Java程式設計之:Reactor模型

三、主從Reactor多線程

1)Reactor主線程MainReactor對象通過select監聽連結事件,通過Acceptor處理

2)當Acceptor處理連結事件後,MainReactor将連結配置設定給SubReactor

3)SubReactor将連結加入到隊列進行監聽,并建立Handler進行事件處理

4)當有新事件發生時,SubReactor就會調用對應的Handler處理

5)Handler通過read讀取資料,分發到worker線程池處理,處理完成後傳回給Handler,Handler收到後,通過send将結果傳回給client

6)Reactor主線程可以對應多個Reactor子線程

Java程式設計之:Reactor模型

四、總結

三種模式用生活案例來了解

1)單Reactor單線程,前台接待員和服務員是同一個人,全程為顧客服務

2)單Reactor多線程,1個前台接待員,多個服務員,接待員隻負責接待

3)主從Reactor多線程,多個前台接待員,多個服務員

Reactor模型具有如下優點

1)響應快,不必為單個同步事件所阻塞,雖然Reactor本身依然是同步的

2)可以最大程度的避免複雜的多線程及同步問題,并且避免了多線程/程序的切換開銷

3)擴充性好,可以友善的通過增加Reactor執行個體個數來充分利用CPU資源

4)複用性好,Reactor模型本身與具體事件處理邏輯無關,具有很高的複用性

繼續閱讀