Netty系列三:netty執行緒模型
阿新 • • 發佈:2019-01-05
netty使用reactor反應堆執行緒模型。
一、Reactor模型單執行緒模型如下:
- 使用者發起IO操作到事件分離器
- 事件分離器呼叫相應的處理器處理事件
- 事件處理完成,事件分離器獲得控制權,繼續相應處理
二、Reactor模型多執行緒模型如下:
但單執行緒的Reactor模型每一個使用者事件都在一個執行緒中執行:
- 效能有極限,不能處理成百上千的事件
- 當負荷達到一定程度時,效能將會下降
- 某一個事件處理器傳送故障,不能繼續處理其他事件
三、Reactor主從多現成模型
- Acceptor(boss執行緒池)不再是一個單獨的NIO執行緒,而是一個獨立的NIO執行緒池
- Acceptor(boss執行緒池)處理完後,將事件註冊到IO執行緒池(work執行緒池)的某個執行緒上
- IO執行緒繼續完成後續的IO操作
- Acceptor(boss執行緒池)僅僅完成登入、握手和安全認證等操作,IO(work執行緒池)操作和業務處理依然在後面的從執行緒中完成
NioEventLoop
NioEventLoop是Netty的Reactor執行緒,它在Netty Reactor執行緒模型中的職責如下:
- 作為服務端Acceptor執行緒,負責處理客戶端的請求接入
- 作為客戶端Connecor執行緒,負責註冊監聽連線操作位,用於判斷非同步連線結果
- 作為IO執行緒,監聽網路讀操作位,負責從SocketChannel中讀取報文
- 作為IO執行緒,負責向SocketChannel寫入報文傳送給對方,如果發生寫半包,會自動註冊監聽寫事件,用於後續繼續傳送半包資料,直到資料全部發送完成
如下圖,是一個NioEventLoop的處理鏈:
- handler處理鏈中的處理方法是序列化執行的
- 一個客戶端連線只註冊到一個NioEventLoop上,避免了多個IO執行緒併發操作