Netty原理(二)Netty線程模型

Netty 的設(shè)計(jì)主要基于主從 Reactor 多線程模式,并有一定的優(yōu)化
逐步遞進(jìn)來(lái)講一下Netty模型

1.簡(jiǎn)單版Netty模型

image.png

·BossGroup 線程維護(hù) Selector,ServerSocketChannel 注冊(cè)到這個(gè) Selector 上,只關(guān)注連接
建立請(qǐng)求事件(主 Reactor)
·當(dāng)接收到來(lái)自客戶端的連接建立請(qǐng)求事件的時(shí)候,通過(guò) ServerSocketChannel.accept 方法獲
得對(duì)應(yīng)的 SocketChannel,并封裝成 NioSocketChannel 注冊(cè)到 WorkerGroup 線程中的
Selector,每個(gè) Selector 運(yùn)行在一個(gè)線程中(從 Reactor)
·當(dāng) WorkerGroup 線程中的 Selector 監(jiān)聽(tīng)到自己感興趣的 IO 事件后,就調(diào)用 Handler 進(jìn)行
處理

2.進(jìn)階版Netty模型

image.png

·有兩組線程池:BossGroup 和 WorkerGroup,BossGroup 中的線程專門(mén)負(fù)責(zé)和客戶端建立
連接,WorkerGroup 中的線程專門(mén)負(fù)責(zé)處理連接上的讀寫(xiě)
·BossGroup 和 WorkerGroup 含有多個(gè)不斷循環(huán)的執(zhí)行事件處理的線程,每個(gè)線程都包含一
個(gè) Selector,用于監(jiān)聽(tīng)注冊(cè)在其上的 Channel
·每個(gè) BossGroup 中的線程循環(huán)執(zhí)行以下三個(gè)步驟
1 輪訓(xùn)注冊(cè)在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
2 處理 accept 事件,與客戶端建立連接,生成一個(gè) NioSocketChannel,并將其注冊(cè)到
WorkerGroup 中某個(gè)線程上的 Selector 上
3 再去以此循環(huán)處理任務(wù)隊(duì)列中的下一個(gè)事件

每個(gè) WorkerGroup 中的線程循環(huán)執(zhí)行以下三個(gè)步驟
1.輪訓(xùn)注冊(cè)在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事
件)
2.在對(duì)應(yīng)的 NioSocketChannel 上處理 read/write 事件
3.再去以此循環(huán)處理任務(wù)隊(duì)列中的下一個(gè)事件

3.詳細(xì)版Netty模型

image.png

--Netty 抽象出兩組線程池:BossGroup 和 WorkerGroup,也可以叫做
BossNioEventLoopGroup 和 WorkerNioEventLoopGroup。每個(gè)線程池中都有
NioEventLoop 線程。BossGroup 中的線程專門(mén)負(fù)責(zé)和客戶端建立連接,WorkerGroup 中的
線程專門(mén)負(fù)責(zé)處理連接上的讀寫(xiě)。BossGroup 和 WorkerGroup 的類型都是NioEventLoopGroup
--NioEventLoopGroup 相當(dāng)于一個(gè)事件循環(huán)組,這個(gè)組中含有多個(gè)事件循環(huán),每個(gè)事件循環(huán)就
是一個(gè) NioEventLoop
--NioEventLoop 表示一個(gè)不斷循環(huán)的執(zhí)行事件處理的線程,每個(gè) NioEventLoop 都包含一個(gè)
Selector,用于監(jiān)聽(tīng)注冊(cè)在其上的 Socket 網(wǎng)絡(luò)連接(Channel)
--NioEventLoopGroup 可以含有多個(gè)線程,即可以含有多個(gè) NioEventLoop
--每個(gè) BossNioEventLoop 中循環(huán)執(zhí)行以下三個(gè)步驟
1 select:輪訓(xùn)注冊(cè)在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
2 processSelectedKeys:處理 accept 事件,與客戶端建立連接,生成一個(gè)
3 NioSocketChannel,并將其注冊(cè)到某個(gè) WorkerNioEventLoop 上的 Selector 上
runAllTasks:再去以此循環(huán)處理任務(wù)隊(duì)列中的其他任務(wù)

每個(gè) WorkerNioEventLoop 中循環(huán)執(zhí)行以下三個(gè)步驟
1 select:輪訓(xùn)注冊(cè)在其上的 NioSocketChannel 的 read/write 事件
(OP_READ/OP_WRITE 事件)
2 processSelectedKeys:在對(duì)應(yīng)的 NioSocketChannel 上處理 read/write 事件
3 runAllTasks:再去以此循環(huán)處理任務(wù)隊(duì)列中的其他任務(wù)

--在以上兩個(gè)processSelectedKeys步驟中,會(huì)使用 Pipeline(管道),Pipeline 中引用了
Channel,即通過(guò) Pipeline 可以獲取到對(duì)應(yīng)的 Channel,Pipeline 中維護(hù)了很多的處理器
(攔截處理器、過(guò)濾處理器、自定義處理器等)。

?著作權(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)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽(tīng)閱讀 10,916評(píng)論 0 11
  • 彩排完,天已黑
    劉凱書(shū)法閱讀 4,499評(píng)論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,919評(píng)論 2 7

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