【Netty】主从反应器 ( Reactor ) 多线程模型
文章目錄
- 一、 主從 反應器 ( Reactor ) 多線程 模式
- 二、 主從 反應器 ( Reactor ) 多線程 工作流程
- 三、 主從 反應器 ( Reactor ) 多線程 優缺點分析
- 四、 單個主 Reactor 多個從 Reactor 多線程模型元素
- 五、 單個主 Reactor 多個從 Reactor 多線程模型工作流程
- 六、 多個主 Reactor 多個從 Reactor 多線程模型
一、 主從 反應器 ( Reactor ) 多線程 模式
單反應器 ( Reactor ) 單線程模型 弊端 : 反應器 ( Reactor ) 運行在一個線程中 , 同時處理客戶端連接 , 與客戶端數據收發 , 在高并發的情況下會產生阻塞 ;
主從 反應器 ( Reactor ) 多線程 模式 :
1 . 主反應器 ( MainReactor ) : 運行在獨立的 Reactor 主線程中 , 該線程中只負責與客戶端的連接請求 ;
2 . 從反應器 ( SubReactor ) : 運行在獨立的 Reactor 子線程中 , 該線程中負責與客戶端的讀寫操作 ; 在該子線程中 , 從反應器 ( Reactor ) 監聽多個客戶端的請求事件 , 如果監聽到客戶端的數據發送事件 , 將對應的業務邏輯轉發給 處理器 ( Handler 進行處理 ) ;
3 . 主反應器 ( MainReactor ) 與 從反應器 ( SubReactor ) 對應關系 : 主反應器在服務器端只有一個 , 但是從反應器在服務器端 , 不只一個 , 可以運行多個 Reactor 子線程 , 每個子線程中運行一個 從反應器 ;
之后的操作與 單反應器 ( Reactor ) 多線程的處理機制一樣 ;
4 . 服務器端 處理者 ( Handler ) : Handler 只負責響應業務處理的請求事件 , 不處理具體的與客戶端交互的業務邏輯 , 因此不會長時間阻塞 , 其調用 read 方法讀取客戶端數據后 , 將業務邏輯交給 線程池 ( Worker ) 處理相關業務邏輯 , 處理完畢后 , 將結果返回 , Handler 將該結果寫出到客戶端 ;
5 . 服務器端 線程池 ( Worker ) : 接收 處理者 ( Handler ) 的請求 , 為將請求對應業務邏輯操作 , 分配給某個獨立線程完成 , 執行完成后的結果再次返回給 處理者 ( Handler ) ,
( Handler 讀取客戶端數據 -> Worker 線程池分配線程執行業務處理操作 -> Handler 將結果回送給客戶端 )
6 . 從反應器 ( SubReactor ) 與 線程池 ( Worker ) 對應關系 : 每個從反應器對應一個線程池 , 也就是說每個主反應器 對應多個 從反應器及配套的線程池 ;
二、 主從 反應器 ( Reactor ) 多線程 工作流程
1 . 主反應器監聽連接 :
① 主反應器 ( MainReactor ) 監聽連接 : 主反應器 ( MainReactor ) 在主線程中 select 監聽客戶端的連接事件 , 監聽到客戶端連接事件后 , 將事件交給 接受者 ( Acceptor ) 進行處理 ;
② 接受者 ( Acceptor ) 建立連接 : 接受者 ( Acceptor ) 調用 accept 與客戶端建立連接 , 主反應器 ( MainReactor ) 將該連接交給一個 子反應器 ( SubReactor ) 管理該連接 , 這里注意一個子反應器需要管理多個連接 ;
2 . 從反應器管理多個客戶端連接 :
① 連接管理隊列 : 從反應器 ( SubReactor ) 中維護了一個連接隊列 , 隊列中的連接都是主反應器傳遞下來的 ;
② 創建 處理者 ( Handler ) : 從反應器 ( SubReactor ) 接受 主反應器傳遞的客戶端連接 , 將其加入到連接隊列中 , 并為該客戶端連接創建 處理者 ( Handler ) ;
③ 處理者 ( Handler ) 作用 : 處理者 ( Handler ) 負責處理與對應客戶端連接之間的數據交互 , 如從連接中讀取客戶端數據 , 寫出數據到客戶端中 ;
3 . 從反應器監聽客戶端數據上傳并進行相應處理 :
① 監聽客戶端數據上傳事件 : 從反應器 ( SubReactor ) 調用 select 方法 , 監聽其管理的客戶端連接 , 如果客戶端有數據上傳 , 會觸發事件 , 從反應器就會調用該客戶端連接對應的 處理者 ( Handler ) 處理事件 ;
② 讀取數據并分發事件 : 處理者 ( Handler ) 處理事件 , 首先調用 read 讀取客戶端上傳的數據 , 然后將該數據分發給 線程池 ( Worker ) ;
③ 線程池 ( Worker ) 工作 : 線程池 ( Worker ) 為事件對應的業務邏輯分配線程執行該耗時操作 , 然后將執行結果返回給 Handler ;
④ 處理結果 : 處理者 ( Handler ) 接收到該數據后 , 將結果發送給客戶端 ;
三、 主從 反應器 ( Reactor ) 多線程 優缺點分析
1 . 主從 反應器 ( Reactor ) 多線程 模型優點 :
① 分工明確 , 互不干擾 :
- 主反應器 ( MainReactor ) 在主線程中運行 , 只負責客戶端的連接 ;
- 多個 子反應器 ( SubReactor ) 分別在對應的子線程中運行 , 負責每個客戶端連接的數據交互 , 與業務邏輯調度 ; 這里的子反應器和對應的子線程有多個 ;
② 主線程 與 子線程交互簡單 : 主線程中 , 主反應器將接受者 ( Acceptor ) 建立好的連接交給子線程中的子反應器 , 除此之外 , 主線程與子線程沒有其它的數據交互 ;
2 . 主從 反應器 ( Reactor ) 多線程 模型缺點 : 該模型比較復雜 , 編程時需要封裝各個模塊 , 如 主反應器 ( MainReactor ) , 子反應器 ( SubReactor ) , 接受者 ( Acceptor ) , 處理者 ( Handler ) , 線程池 ( Worker ) , 代碼實現復雜 ;
四、 單個主 Reactor 多個從 Reactor 多線程模型元素
Netty 線程模型是在 主從 反應器 ( Reactor ) 多線程模型的基礎上改進而來的 ;
1 . BossGroup : 服務器端運行一個 BossGroup , 負責處理客戶端申請連接的 Accept 事件 , Selector 監聽客戶端的連接事件 , 監聽到該事件后 , 會調用 accept 方法 , 建立服務器端與客戶端的連接 ;
2 . 客戶端連接 : 上述連接的載體是 NIO 中的 套接字通道 ( SocketChannle ) , 將上述 SocketChannle 封裝到 NIOSocketChannle 中 ;
3 . WorkerGroup : 與 BossGroup 相對應的是 WorkerGroup , 在 WorkerGroup 中也有 Selector ;
4 . 處理者 ( Handler ) : 將建立好的連接通道 NIOSocketChannle 注冊到 WorkerGroup 中的 Selector 中 , 該 Selector 監聽客戶端的數據傳輸 , 如果客戶端有數據上傳 , 被該 Selector 監聽到 , 就會將該事件交給 Handler 進行處理 ;
五、 單個主 Reactor 多個從 Reactor 多線程模型工作流程
1 . 監聽連接 : BossGroup 中維護了一個 Selector , 該 Selector 只監聽 Accept 事件 , 即客戶端連接事件 ;
2 . 建立連接 : Selector 監聽到 Accept 事件 , 就會調用 accept 方法 , 獲取對應的 套接字通道 ( SocketChannel ) , 之后將該套接字通道封裝成 NIOSocketChannel ;
3 . 注冊通道 : 將上述封裝后的 NIOSocketChannel 注冊給 Worker 線程的 Selector , 該線程中一直不停的再進行事件循環監聽 , 在該線程中維護相關的與客戶端的連接通道 ; 注冊時 , 會將 Handler 關聯對應的 NIOSocketChannel 通道 ;
4 . 處理數據交互 : 當 Worker 線程中的 Selector 監聽到客戶端連接數據上傳事件后 , 就會調用 Handler 處理該事件 ;
六、 多個主 Reactor 多個從 Reactor 多線程模型
1 . BossGroup 線程 : 上述簡單模型中 , 只有一個 BossGroup 線程 , 在 Netty 中該線程可以存在多個 , 每個 BossGroup 線程中運行一個 NioEventLoop ;
2 . NioEventLoop 作用 : 在每個 NioEventLoop 中 , 都有一個 Selector , 該 Selector 作用是循環監聽 IO 事件 , 如果監聽到 IO 事件 , 就處理該 IO 事件 , 然后更新處理任務隊列 , 然后繼續監聽 ;
3 . WorkerGroup : BossGroup 線程監聽到連接事件后 , 連接客戶端 , 并將封裝好的 NIOSocketChannel 注冊給 WorkerGroup 中的某個 Selector 上 ;
總結
以上是生活随笔為你收集整理的【Netty】主从反应器 ( Reactor ) 多线程模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Netty】反应器 Reactor 模
- 下一篇: 【Netty】Netty 入门案例分析