網(wǎng)絡(luò)線程模型

傳統(tǒng)阻塞 I/O 服務(wù)模型

傳統(tǒng)阻塞 I/O 服務(wù)模型采用阻塞式I/O獲取輸入的數(shù)據(jù),每個(gè)連接都需要獨(dú)立的線程完成數(shù)據(jù)的輸入、業(yè)務(wù)的處理、以及數(shù)據(jù)的返回;因此會(huì)發(fā)生兩個(gè)問(wèn)題:(1).當(dāng)并發(fā)數(shù)很大時(shí),就會(huì)創(chuàng)建大量的線程,占用較大的系統(tǒng)資源;(2).連接創(chuàng)建后,如果當(dāng)前線程暫時(shí)沒(méi)有數(shù)據(jù)可讀,該線程會(huì)阻塞在 Handler對(duì)象中的read 操作,導(dǎo)致資源浪費(fèi);

傳統(tǒng)阻塞 IO 服務(wù)模型.jpg

Reactor 模式服務(wù)模型

反應(yīng)器 Reactor模式基于 I/O 復(fù)用模型,多個(gè)連接共用一個(gè)ServiceHandler阻塞對(duì)象,程序無(wú)需阻塞等待所有連接,這樣就減少了阻塞時(shí)間;當(dāng)多個(gè)客戶端進(jìn)行連接時(shí),先把連接請(qǐng)求交給ServiceHandler,ServiceHandler把請(qǐng)求分派到對(duì)應(yīng)的EventHandler進(jìn)行處理;Reactor模式根據(jù)Reactor 的數(shù)量和處理資源池線程的數(shù)量不同分為三種實(shí)現(xiàn):?jiǎn)?Reactor 單線程、單 Reactor多線程、主從 Reactor多線程;

Reactor模式.jpg

1.單 Reactor 單線程模型

Reactor 單線程模型實(shí)現(xiàn)中Reactor 對(duì)象通過(guò) Select 監(jiān)控客戶端請(qǐng)求事件,收到事件后通過(guò) Dispatch 進(jìn)行分發(fā);若此時(shí)有客戶端請(qǐng)求:首先判斷請(qǐng)求類型;如果是建立連接請(qǐng)求事件,則由 Acceptor 通過(guò) accept 處理連接請(qǐng)求,然后創(chuàng)建一個(gè) Handler 對(duì)象處理連接完成后的后續(xù)業(yè)務(wù)處理;如果不是建立連接事件,則 Reactor 會(huì)分發(fā)調(diào)用連接對(duì)應(yīng)的 Handler 來(lái)處理(這里的Handler負(fù)責(zé)事件的響應(yīng)和業(yè)務(wù)的處理);這種實(shí)現(xiàn)中所有請(qǐng)求的所有操作通過(guò)一個(gè)線程處理很容易導(dǎo)致性能瓶頸;

單Reactor單線程.jpg

2.單 Reactor 多線程模型

Reactor多線程模型實(shí)現(xiàn)中Reactor 對(duì)象通過(guò) Select 監(jiān)控客戶端請(qǐng)求事件,收到事件后,通過(guò) Dispatch 進(jìn)行分發(fā);若此時(shí)有客戶端請(qǐng)求:首先判斷請(qǐng)求類型;如果是建立連接請(qǐng)求事件,則由 Acceptor 通過(guò) accept 處理連接請(qǐng)求,然后創(chuàng)建一個(gè) Handler 對(duì)象處理連接完成后的后續(xù)業(yè)務(wù)處理;如果不是建立連接事件,則 Reactor 會(huì)分發(fā)調(diào)用連接對(duì)應(yīng)的 Handler 來(lái)處理(這里handler 負(fù)責(zé)響應(yīng)事件,不做具體的業(yè)務(wù)處理),Handler通過(guò) read 讀取數(shù)據(jù)后,會(huì)分發(fā)給后面的 worker 線程池,worker 線程池會(huì)分配獨(dú)立線程完成真正的業(yè)務(wù),并將結(jié)果返回給 handler;這種實(shí)現(xiàn)中Reactor 在主線程中運(yùn)行并且承擔(dān)了所有事件的監(jiān)聽(tīng)和響應(yīng),主線程承擔(dān)了過(guò)多的任務(wù),高并發(fā)場(chǎng)景下也容易導(dǎo)致性能瓶頸;

單Reactor多線程.jpg

3.主從 Reactor 多線程模型

主從Reactor多線程模型實(shí)現(xiàn)中,Reactor 主線程中的 MainReactor 對(duì)象通過(guò) select 監(jiān)聽(tīng)連接事件;若此時(shí)有客戶端請(qǐng)求:MainReactor收到事件后就通過(guò) Acceptor 處理連接事件;當(dāng) Acceptor 處理連接事件后,MainReactor 會(huì)將連接分配給 SubReactor(MainReactorSubReactor是一對(duì)多的模型);subreactor 將連接加入到連接隊(duì)列進(jìn)行監(jiān)聽(tīng),并創(chuàng)建 handler 進(jìn)行各種事件處理;當(dāng)有新事件發(fā)生時(shí),subreactor 就會(huì)調(diào)用對(duì)應(yīng)的 handler 處理;handler 通過(guò) read 讀取數(shù)據(jù),分發(fā)給后面的 worker 線程處理;worker 線程池分配獨(dú)立的 worker 線程進(jìn)行業(yè)務(wù)處理,并返回結(jié)果,handler 收到響應(yīng)的結(jié)果后,再通過(guò) send 將結(jié)果返回給 client

主從Reactor多線程.jpg

Netty Reactor服務(wù)模型

Netty 抽象出兩組線程池 :BossGroupWorkerGroup,其中BossGroup 專門(mén)負(fù)責(zé)接收客戶端的連接,WorkerGroup專門(mén)負(fù)責(zé)網(wǎng)絡(luò)的讀寫(xiě);BossGroupWorkerGroup中對(duì)象的類型都是 NioEventLoopGroup ,NioEventLoopGroup 相當(dāng)于一個(gè)事件循環(huán)組,這個(gè)組中含有多個(gè)事件循環(huán)對(duì)象NioEventLoop;NioEventLoop 表示一個(gè)不斷循環(huán)的執(zhí)行處理任務(wù)的線程,每個(gè) NioEventLoop 都有一個(gè) Selector,用于監(jiān)聽(tīng)綁定在其上的 socket 的網(wǎng)絡(luò)通訊;

每個(gè) BossGroup下面的NioEventLoopGroup 中的NioEventLoop 循環(huán)執(zhí)行的步驟有 3 步:(1)輪詢 accept 事件;(2)處理 accept 事件,與 client 建立連接,生成 NioScocketChannel,并將其注冊(cè)到某個(gè) workerGroupNIOEventLoop 上的 Selector上;(3)繼續(xù)處理任務(wù)隊(duì)列的任務(wù),即 runAllTasks

每個(gè) WorkerGroup 下面的NioEventLoopGroup 中的NIOEventLoop 循環(huán)執(zhí)行的步驟:(1)輪詢 readwrite 事件;(2)處理 I/O 事件,即 read,write 事件,在對(duì)應(yīng) NioScocketChannel 處理;(3)處理任務(wù)隊(duì)列的任務(wù),即 runAllTasks

Netty線程模型.jpg
最后編輯于
?著作權(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)容