溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Reactor的原理及結(jié)構(gòu)是什么

發(fā)布時間:2021-12-09 15:33:20 來源:億速云 閱讀:313 作者:柒染 欄目:大數(shù)據(jù)

Reactor的原理及結(jié)構(gòu)是什么,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

雖然在Java中沒有真的IO多路復(fù)用模型,但是Reactor就是NIO實現(xiàn)多路復(fù)用的一種模式。

Reactor是什么

Reactor設(shè)計模式是一種事件處理模式,用于處理通過一個或多個輸入同時交付給服務(wù)處理程序的服務(wù)請求。然后,服務(wù)處理程序?qū)魅氲恼埱筮M行多路分解,并將它們同步分發(fā)到關(guān)聯(lián)的請求處理程序。

Reactor的原理及結(jié)構(gòu)是什么  

從上述表述中我們大致可以總結(jié)出:

  • 基于事件驅(qū)動
  • 可以處理一個或多個輸入源
  • 通過ServiceHandler同時將輸入事件采用多路復(fù)用分發(fā)給相應(yīng)的RequestHandler(多個)處理

對應(yīng)我們的NIO中的實現(xiàn):

  • 同步的等待多個事件源(Event)到達(采用select()實現(xiàn))
  • 將事件多路分解以及分配相應(yīng)的事件服務(wù)進行處理,這個分派采用server集中處理(Dispatch)
  • 分解的事件以及對應(yīng)的事件服務(wù)應(yīng)用從分派服務(wù)中分離出去(RequestHandler)
 
Reactor結(jié)構(gòu)

Reactor的原理及結(jié)構(gòu)是什么上述Reactor模型主要涉及的類有:

  • InitiationDispatcher:EventHandler的容器,用來注冊、移除EventHandler等;另外,它作為Reactor模式的入口調(diào)用SynchronousEventDemultiplexer的select方法以阻塞等待事件的返回,當(dāng)阻塞事件返回時,將事件發(fā)生的Handle分發(fā)到相應(yīng)的EventHandler處理。
  • EvenHandler:定義了事件處理的方法。
  • Handle:即操作系統(tǒng)中的句柄,是對資源在操作系統(tǒng)層面上的一種抽象,它可以是打開的文件、一個連接Socket等。
  • SynchronousEventDemultiplexer:使用一個事件循環(huán),以阻止所有的資源。當(dāng)可以啟動一個同步操作上的資源不會阻塞,多路分解器發(fā)送資源到分發(fā)器
 
Reactor時序圖
Reactor的原理及結(jié)構(gòu)是什么  
  1. 初始化InitiationDispatcher,并初始化一個Handler到EventHandler的Map
  2. 注冊EventHandler到InitiationDispatcher,每個EventHandler包含Handler的引用,從而建立Handler到EventHandler的映射
  3. 調(diào)用InitiationDispatcher的handle_events()方法啟動EventLoop,在EventLoop中調(diào)用select()方法(SynchronousEventDemultiplexer)阻塞等待Event發(fā)生
  4. 當(dāng)某個或某些Handler的Event發(fā)生以后,select()方法返回,InitiationDispatcher根據(jù)返回的Hanler找到注冊的EventHandler,并回調(diào)該EventHandler的handler_event方法
  5. 在EventHandler的handler_event()方法中還可以向InitiationDispatcher中注冊新的EventHandler,比如對AcceptorEventHandler來說,當(dāng)有新的client連接時,它會產(chǎn)生新的EventHandler以處理新的連接,并注冊到InitiationDispatcher中。
 
Reactor
 
Reactor單線程模型
Reactor的原理及結(jié)構(gòu)是什么  

最基本的單線程Reactor模型,Reactor負責(zé)多路分離套接字(阻塞并且當(dāng)事件觸發(fā)時進行分發(fā)),當(dāng)有新連接觸發(fā)到CONNECT事件后,交由Accptor處理,有IO讀寫事件交由Handler處理。

Accceptor負責(zé)獲取與客戶端建立的SocketChannel,綁定對應(yīng)的EventHandler,當(dāng)該SocketChannel上有事件發(fā)生時就可以獲取到對應(yīng)的EventHandler并進行處理。

 
單Reactor多線程模型
Reactor的原理及結(jié)構(gòu)是什么  

相對于單Reactor模型,我們在獲取到IO事件以后可以交由線程池處理,可以減少Reactor線程的消耗,Reactor從而更加專注的關(guān)注于事件的分發(fā)。

 
多Reactor多線程模型
Reactor的原理及結(jié)構(gòu)是什么  
  • mainReactor負責(zé)監(jiān)聽ServerSocket,用來處理新連接的建立,通常單線程就可以處理,將建立的SocketChannel指定注冊給subReactor。
  • subReactor(它的個數(shù)一般是和CPU個數(shù)等同)維護自己的selector,基于mainReactor注冊的socketChannel多路分離IO讀寫事件,讀寫網(wǎng)絡(luò)數(shù)據(jù),對業(yè)務(wù)處理的功能,將其扔給worker線程池來完成。
 

關(guān)于Reactor的原理及結(jié)構(gòu)是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI