Reactor模型學(xué)習(xí)

一、背景

對(duì)于應(yīng)用服務(wù)器,CPU的處理速度是要遠(yuǎn)遠(yuǎn)快于IO速度的,如果CPU為了IO操作而阻塞顯然是不劃算的。

處理方式一:分為多進(jìn)程或者線程去進(jìn)行處理。缺點(diǎn):增加一些進(jìn)程切換的開(kāi)銷。

處理方式二:事件驅(qū)動(dòng)(或者叫回調(diào)的方式),應(yīng)用業(yè)務(wù)向一個(gè)中間人注冊(cè)一個(gè)回調(diào)(event handler),當(dāng)IO就緒后,就這個(gè)中間人產(chǎn)生一個(gè)事件,并通知此handler進(jìn)行處理。

Reactor為事件驅(qū)動(dòng)中的中間人,它接受所有handler的注冊(cè),并負(fù)責(zé)檢查操作系統(tǒng)O是否就緒,在就緒后就調(diào)用指定handler進(jìn)行處理。它是一個(gè)不斷等待和循環(huán)的單獨(dú)進(jìn)程(線程)。

關(guān)于NIO中的Reactor模式,請(qǐng)參考Doug Lea的《Scalable IO in Java》。


二、Reactor的幾種模式

在web服務(wù)中,很多都涉及基本的操作:read request、decode request、process service、encod reply、send reply等。

1 單線程模式

這是最簡(jiǎn)單的單Reactor單線程模型。Reactor線程是個(gè)多面手,負(fù)責(zé)多路分離套接字,Accept新連接,并分派請(qǐng)求到處理器鏈中。該模型適用于處理器鏈中業(yè)務(wù)處理組件能快速完成的場(chǎng)景。不過(guò)這種單線程模型不能充分利用多核資源,所以實(shí)際使用的不多。


2 多線程模式(單Reactor)

該模型在事件處理器(Handler)鏈部分采用了多線程(線程池),也是后端程序常用的模型。

3 多線程模式(主從Reactor)

比起第二種模型,它是將Reactor分成兩部分,mainReactor負(fù)責(zé)監(jiān)聽(tīng)并accept新連接,然后將建立的socket通過(guò)多路復(fù)用器(Acceptor)分派給subReactor。subReactor負(fù)責(zé)多路分離已連接的socket,讀寫(xiě)網(wǎng)絡(luò)數(shù)據(jù);業(yè)務(wù)處理功能,其交給worker線程池完成。通常,subReactor個(gè)數(shù)上可與CPU個(gè)數(shù)等同。(主Reactor用于響應(yīng)連接請(qǐng)求,從Reactor用于處理IO操作請(qǐng)求!)

好處:因?yàn)閟ubReactor也會(huì)執(zhí)行一些比較耗時(shí)的IO操作,例如消息的讀寫(xiě),使用多個(gè)線程去執(zhí)行,則更加有利于發(fā)揮CPU的運(yùn)算能力,減少I(mǎi)O等待時(shí)間。


參考:

http://blog.csdn.net/u013074465/article/details/46276967

http://www.itdecent.cn/p/2461535c38f3

https://github.com/code4craft/netty-learning/blob/master/posts/ch4-reactor.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容