一、背景
對(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