004——Netty之高性能IO(Reactor)
阿新 • • 發佈:2018-11-25
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)