天天看點

Reactor網絡模型結構

Reactor網絡模型四個重要元件:Event事件、Reactor反應堆、Demultiplex事件分發器、Evanthandler事件處理器

The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
Reactor網絡模型結構
  • Event:事件的sockfd,事件類型(EPOLL_IN、EPOLL_OUT…)
  • Reactor:維護事件event以及事件處理EventHandler的集合
  • Demultiplex:多路複用分發器,監聽sockfd上相應的事件,有事件發生的時候把事件清單傳回給Reactor
  • EventHandler: 讀取使用者事件的請求read,反序列化,業務邏輯處理計算,對處理的結果序列化,send給使用者傳回一個響應

在整個基于Reactor模型的網絡服務互動階段,首先我們把事件注冊到反應堆上,也就是說,應用程式對這個事件感興趣,請求反應堆幫忙來監聽它所感興趣的事件,并且在這個事件發生的時候調用相應預置的回調Handler

向反應堆注冊事件,就是把這個事件event和對應的事件處理器EventHandler(一個event對應一個EventHandler)都給到reactor反應堆 。反應堆存儲着事件event以及事件處理的集合,可以添加更多選項,比如說事件添加的時間,事件響應的時間等等

reactor反應堆維護了事件event以及事件處理的集合,底層會通過epoll_ctl進行設定事件,調整事件,添加新的事件,修改已有事件,删除已有事件。然後啟動反應堆,反應堆就會驅動事件分發器的啟動,開啟多路複用,實際上就是開啟epoll_wait,然後伺服器監聽新使用者的連接配接,或是已連接配接使用者的讀寫事件

如果epoll_wait有監聽到新的事件的産生,那麼多路複用分發器Demultiplex就會把這個分發的事件給反應堆傳回,因為事件發生了,reactor模型就要調用事件的處理器EventHandler,而這個EventHandler是注冊在reactor反應堆的。反應堆收到多路複用分發器傳回的事件後,reactor就會找到并調用event對應的EventHandler(一般用map表)處理事件。一般來說處理事件要麼是建立連接配接,要麼是讀取資料處理并傳回,需要進行資料的序列化和反序列化

muduo網絡庫使用的Multiple Reactors模型

Reactor網絡模型結構

圖中反應堆mainReactor和subReactor,實際上都是代表着我們上面說的Reactor和Demultiplex事件分發器,由他們監聽具體事件的發生,維護事件event以及事件處理EventHandler的集合,調用相應的回調處理函數

多路事件分發器執行的就是epoll_wait,進行事件循環監聽。對于經典的網絡I/O模型,一般使用多線程循環監聽,比如我們使用一個線程專門循環監聽新使用者的連接配接,多個線程循環監聽已連接配接使用者的讀寫事件,如果再有其他耗時的操作,比如說傳輸檔案,就再起一個線程去處理這些操作

事件循環監聽完成以後,就會根據事件對應的EventHandler處理請求

Reactor網絡模型結構

muduo的特點是one loop per thread,有一個main reactor負載accept連接配接,然後把連接配接分發到某個sub reactor(采用round-robin的方式來選擇sub reactor),該連接配接的所有操作都在sub reactor所處的線程中完成。多個連接配接可能被分派到多個線程中,以充分列用CPU

繼續閱讀