Reactor模式和Proactor模式

Reactor模式,也叫做Dispatcher模式

使用IO多路復(fù)用解決系統(tǒng)資源浪費(fèi)的問題,Reactor會(huì)監(jiān)聽事件,根據(jù)事件類型來調(diào)用相應(yīng)的代碼進(jìn)行處理。核心組成部分包括Reactor和處理資源池(可以使進(jìn)程池或者線程池),Reactor負(fù)責(zé)監(jiān)聽和分配事件,處理資源池負(fù)責(zé)處理事件。

可以在Reactor和資源池的數(shù)量上進(jìn)行變化,也就是說,會(huì)有以下三種方案

1. 單Reactor單進(jìn)程/線程

單Reactor單線程

Reactor通過select監(jiān)控連接事件,收到事件后通過dispatch進(jìn)行分發(fā),如果是連接建立的事件,則交給Acceptor處理,否則會(huì)調(diào)用Handler進(jìn)行處理。

優(yōu)點(diǎn):沒有進(jìn)程間通信,進(jìn)程競(jìng)爭(zhēng),都在一個(gè)進(jìn)程內(nèi)完成。缺點(diǎn):只有一個(gè)進(jìn)程,無法發(fā)揮多核CPU優(yōu)勢(shì),handler在處理業(yè)務(wù)時(shí),整個(gè)進(jìn)程無法處理其他連接的事件,性能瓶頸嚴(yán)重。

Redis采用這種方法,因?yàn)槊總€(gè)操作都非常快結(jié)束

2. 單Reactor多進(jìn)程/線程


單Reactor多線程

Reactor監(jiān)聽連接建立事件,handler只負(fù)責(zé)讀寫操作,業(yè)務(wù)處理交給子線程processor完成,process完成后將結(jié)果交給handler,handler寫入結(jié)果。

優(yōu)點(diǎn):能發(fā)揮多核CPU的處理能力。缺點(diǎn):多線程數(shù)據(jù)共享和訪問比較復(fù)雜,Reactor監(jiān)聽所有事件,并且只在主線程中運(yùn)行,瞬間高并發(fā)時(shí)會(huì)成為性能瓶頸

3. 多Reactor多進(jìn)程/線程


多Reactor多進(jìn)程/線程

主Reactor只處理連接事件的建立,然后把連接交給子進(jìn)程Reactor進(jìn)行監(jiān)聽,子進(jìn)程創(chuàng)建handler進(jìn)行完整業(yè)務(wù)處理。

優(yōu)點(diǎn):主Reactor和子Reactor職責(zé)明確,交互簡(jiǎn)單,子進(jìn)程之間不需要共享同步之類的處理。

Nginx采用的就是多Reactor多進(jìn)程,Memcache和Netty用的是多Reactor多線程


Proactor

Reactor是非阻塞同步網(wǎng)絡(luò)模型,因?yàn)檎嬲膔ead和send操作都需要用戶進(jìn)程同步操作。這里的同步指的是用戶進(jìn)程在執(zhí)行read和send之類IO操作的時(shí)候是同步的,如果把IO操作改為異步的就能夠進(jìn)一步提升性能,這就是異步網(wǎng)絡(luò)模型Proactor。


Proactor模型

1. Proactor Initiator創(chuàng)建Proactor和Handler,并將Proactor和Handler都通過Asynchronous Operation Processor注冊(cè)到內(nèi)核。

2. Asynchronous Operation Processor 負(fù)責(zé)處理注冊(cè)請(qǐng)求,完成IO操作

3. Asynchronous Operation Process 完成IO操作后通知Proactor

4. Proactor根據(jù)不同的事件類型回調(diào)不同的handler進(jìn)行業(yè)務(wù)處理

5. Handler完成業(yè)務(wù)處理,Handler也可以主責(zé)新的Handler到內(nèi)核進(jìn)程

理論上Proactor比Reactor效率要高一些,異步I/O能夠充分利用DMA(直接存儲(chǔ)器訪問)特性,讓I/O操作與計(jì)算重疊,但要實(shí)現(xiàn)真正的異步I/O,操作系統(tǒng)需要做大量的工作。目前Windows下通過IOCP實(shí)現(xiàn)了真正的異步I/O,而在Linux系統(tǒng)下的AIO并不完善,因此在Linux下實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時(shí)都是以Reactor模式為主。所以即使Boost.Asio號(hào)稱實(shí)現(xiàn)了Proactor模型,其實(shí)它在Windows下采用IOCP,而在Linux下是用Reactor模式(采用epoll)模擬出來的異步模型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容