雖然在Java中沒有真的IO多路復用模型,但是Reactor就是NIO實現多路復用的一種模式。
Reactor是什么
Reactor設計模式是一種事件處理模式,用于處理通過一個或多個輸入同時交付給服務處理程序的服務請求。然后,服務處理程序對傳入的請求進行多路分解,并將它們同步分發到關聯的請求處理程序。
從上述表述中我們大致可以總結出:
- 通過ServiceHandler同時將輸入事件采用多路復用分發給相應的RequestHandler(多個)處理
對應我們的NIO中的實現:
- 同步的等待多個事件源(Event)到達(采用select()實現)
- 將事件多路分解以及分配相應的事件服務進行處理,這個分派采用server集中處理(Dispatch)
- 分解的事件以及對應的事件服務應用從分派服務中分離出去(RequestHandler)
Reactor結構
上述Reactor模型主要涉及的類有:
- InitiationDispatcher:EventHandler的容器,用來注冊、移除EventHandler等;另外,它作為Reactor模式的入口調用SynchronousEventDemultiplexer的select方法以阻塞等待事件的返回,當阻塞事件返回時,將事件發生的Handle分發到相應的EventHandler處理。
- Handle:即操作系統中的句柄,是對資源在操作系統層面上的一種抽象,它可以是打開的文件、一個連接Socket等。
- SynchronousEventDemultiplexer:使用一個事件循環,以阻止所有的資源。當可以啟動一個同步操作上的資源不會阻塞,多路分解器發送資源到分發器
Reactor時序圖
- 初始化InitiationDispatcher,并初始化一個Handler到EventHandler的Map
- 注冊EventHandler到InitiationDispatcher,每個EventHandler包含Handler的引用,從而建立Handler到EventHandler的映射
- 調用InitiationDispatcher的handle_events()方法啟動EventLoop,在EventLoop中調用select()方法(SynchronousEventDemultiplexer)阻塞等待Event發生
- 當某個或某些Handler的Event發生以后,select()方法返回,InitiationDispatcher根據返回的Hanler找到注冊的EventHandler,并回調該EventHandler的handler_event方法
- 在EventHandler的handler_event()方法中還可以向InitiationDispatcher中注冊新的EventHandler,比如對AcceptorEventHandler來說,當有新的client連接時,它會產生新的EventHandler以處理新的連接,并注冊到InitiationDispatcher中。
Reactor
Reactor單線程模型
最基本的單線程Reactor模型,Reactor負責多路分離套接字(阻塞并且當事件觸發時進行分發),當有新連接觸發到CONNECT事件后,交由Accptor處理,有IO讀寫事件交由Handler處理。
Accceptor負責獲取與客戶端建立的SocketChannel,綁定對應的EventHandler,當該SocketChannel上有事件發生時就可以獲取到對應的EventHandler并進行處理。
單Reactor多線程模型
相對于單Reactor模型,我們在獲取到IO事件以后可以交由線程池處理,可以減少Reactor線程的消耗,Reactor從而更加專注的關注于事件的分發。
多Reactor多線程模型
- mainReactor負責監聽ServerSocket,用來處理新連接的建立,通常單線程就可以處理,將建立的SocketChannel指定注冊給subReactor。
- subReactor(它的個數一般是和CPU個數等同)維護自己的selector,基于mainReactor注冊的socketChannel多路分離IO讀寫事件,讀寫網絡數據,對業務處理的功能,將其扔給worker線程池來完成。
關于Reactor的原理及結構是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。