1. 程式人生 > >004——Netty之高性能IO(Reactor)

004——Netty之高性能IO(Reactor)

read 多個 sub service 數據 用處 event 線程處理 全部

一、原始方式

方法一:

# 使用while循環,不斷監聽端口是否有新的套接字鏈接 
while(true){    
socket = accept();  
handle(socket)  
} 
# 做法局限:處理效率低下,並發是請求只能阻塞

方法二:

# 一個連接對應一個線程
while(true){ 
socket = accept(); 
new thread(socket); 
} 
# 每個線程阻塞不會影響到後續請求,但對資源要求非常高。線程粒度大,每個線程一次性處理所有交互事情(連接、讀取和寫入),限制了吞吐量。

方法三:

# 將線程粒度減小。將一次連接的操作劃分為更細的粒度或者過程。這樣雖然線程數量變多,但是處理的事情更為簡單和單一

二、Reactor定義

關鍵點
  • 事件驅動(event handling)

  • 可以處理一個或多個輸入源(one or more inputs)

  • 通過Service Handler同步的將輸入事件(Event)采用多路復用分發給對應Handler處理

處理流程
  • 同步的等待多個事件源到達(采用select()實現)
  • 將事件多路分解以及分配相應的事件服務進行處理,這個分派采用server集中處理(dispatch)
  • 分解的事件以及對應的事件服務應用從分派服務中分離出去(handler)
使用Reactor的原因

NIO的優點

  • 基於事件驅動(selector支持對多個Channel進行監聽)
  • 統一事件處理分派中心(dispatch)
  • 事件處理服務

不足

  • 更少的開銷,更少的上下文切換以及locking
  • 能夠跟蹤服務器狀態
  • 能夠管理handler 對event的綁定

三、Reactor模式

介紹

Reactor將被拆分的子過程對應到Handler上,每一種handler會處理一種event。Selector全局管理進行全局管理。我們只需要註冊感興趣的channel事件,selector就會通過輪詢的方式不斷檢測channel上的事件是否發生。如果沒有事件發生則線程阻塞,如果時間發生,則調用相應handler進行處理。

非Reactor模型

技術分享圖片

  • 這種模型由於IO在阻塞時會一直等待,因此在用戶負載增加時,性能下降的非常快
  • serversocket的accept方法,阻塞等待client連接,直到client連接成功
  • 線程從socket inputstream讀入數據,會進入阻塞狀態,直到全部數據讀完
  • 線程向socket outputstream寫入數據,會阻塞直到全部數據寫完

Reactor模型

  • Reactor 將I/O事件分派給對應的Handler
  • Acceptor 處理客戶端新連接,並分派請求到處理器鏈中
  • Handlers 執行非阻塞讀/寫任務,Event綁定

單Reactor單線程模型
改進點:基於事件模式,當事件觸發時,才調用處理器進行處理
技術分享圖片

  • 當新連接到來觸發connect事件之後,交由Acceptor進行處理,並構造Handler
  • 有IO讀寫事件之後交給Hanlder處理。
  • 在獲取到Client相關的SocketChannel之後,綁定到相應Handler上。
  • 若是連接事件獲取是acceptor,若是IO讀寫事件獲取是handler。都由Reactor進行分發

Acceptor主要任務就是構建handler ,在獲取到和client相關的SocketChannel之後 ,綁定到相應的hanlder上,對應的SocketChannel有讀寫事件之後,基於racotor 分發,hanlder就可以處理了(所有的IO事件都綁定到selector上,有Reactor分發)。

單Reactor多線程模型
改進:使用多線程處理業務邏輯。
技術分享圖片

  • 專門一個IO線程——Acceptor線程負責監聽服務端請求。
  • 消息讀取、解碼、編碼、發送由線程池負責
  • 一個鏈路只對應一個線程,可以避免同步操作。
  • Reacpter只負責消息分發

多Reactor多線程模型

技術分享圖片

  • mainReactor負責監聽 ServerSocketChannel ,用來處理客戶端新連接的建立,並將建立的客戶端的SocketChannel指定註冊給 subReactor 。
  • subReactor 維護自己的 Selector ,基於 mainReactor 建立的客戶端的 SocketChannel 多路分離 IO 讀寫事件,讀寫網絡數據。對於業務處理的功能,另外扔給 worker 線程池來完成。
  • 該模式為Netty默認模式

https://blog.csdn.net/qq_24313635/article/details/80989450

004——Netty之高性能IO(Reactor)