1. 程式人生 > >Netty系列三:netty執行緒模型

Netty系列三:netty執行緒模型

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執行緒模型中的職責如下:

  1. 作為服務端Acceptor執行緒,負責處理客戶端的請求接入
  2. 作為客戶端Connecor執行緒,負責註冊監聽連線操作位,用於判斷非同步連線結果
  3. 作為IO執行緒,監聽網路讀操作位,負責從SocketChannel中讀取報文
  4. 作為IO執行緒,負責向SocketChannel寫入報文傳送給對方,如果發生寫半包,會自動註冊監聽寫事件,用於後續繼續傳送半包資料,直到資料全部發送完成
    如下圖,是一個NioEventLoop的處理鏈:

這裡寫圖片描述

  • handler處理鏈中的處理方法是序列化執行的
  • 一個客戶端連線只註冊到一個NioEventLoop上,避免了多個IO執行緒併發操作