【Netty】Netty 核心组件 ( ChannelOption | EventLoopGroup )
文章目錄
- 一、 ChannelOption 組件
- 二、 EventLoopGroup 線程池組件
- 三、 BossGroup 與 WorkerGroup 運行機制
一、 ChannelOption 組件
ChannelOption 組件用于對 Channel 通道進行配置 ;
1 . ChannelOption.SO_KEEPALIVE 參數(shù) : 設置該客戶端連接一直處于活躍狀態(tài) ;
2 . ChannelOption.SO_BACKLOG 參數(shù) :
① 設置連接數(shù) : 設置服務器可連接隊列個數(shù) ;
② 連接請求隊列機制 : 當客戶端的請求到達服務器端 , 如果服務器端正在處理其它客戶端的連接的事件時 , 先將本次的客戶端連接請求放入隊列中等待 , ChannelOption.SO_BACKLOG 參數(shù)就是設置該隊列的大小 ;
3 . 關于服務器端連接數(shù)說明 :
① 順序處理 : 服務器端處理客戶端連接的請求事件 , 按照連接隊列中的順序 , 依次處理 ;
② 處理性能 : 服務器端每個線程每次只能處理單個客戶端連接的請求事件 ;
③ 處理極限 : 因此如果連接請求數(shù)過多 , 超出服務器處理能力 , 就會造成整體性能下降 ;
④ 設置限制 : 使用該 ChannelOption.SO_BACKLOG 參數(shù)控制服務器的連接請求數(shù) , 是很有必要的 ;
4 . ChannelOption 配置 Channel 通道示例 :
① option : 用于設置 BossGroup 線程池的參數(shù) , BossGroup 負責與客戶端建立連接 , 因此這里的 ChannelOption.SO_BACKLOG 參數(shù)用于設置連接操作的請求 , 不涉及到與客戶端進行數(shù)據(jù)讀寫 ;
② childOption : 用于設置 WorkerGroup 線程池參數(shù) , WorkerGroup 負責與客戶端進行數(shù)據(jù)交互 ;
ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) // 設置 主從 線程組 , 分別對應 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設置 NIO 網(wǎng)絡套接字通道類型// 核心代碼 ---------------------------------------------------------------------.option(ChannelOption.SO_BACKLOG, 128) // 設置線程隊列維護的連接請求個數(shù).childOption(ChannelOption.SO_KEEPALIVE, true) // 設置連接狀態(tài)行為, 保持連接狀態(tài)// 核心代碼 ---------------------------------------------------------------------.childHandler( null );二、 EventLoopGroup 線程池組件
1 . EventLoopGroup 接口與實現(xiàn)類 :
① 接口 : EventLoopGroup 是接口 , 繼承了 EventExecutorGroup 接口 ;
public interface EventLoopGroup extends EventExecutorGroup② 實現(xiàn)類 : 接口不能直接使用 , 實際使用的類是 NioEventLoopGroup ;
public class NioEventLoopGroup extends MultithreadEventLoopGroup2 . EventLoopGroup 線程池機制 :
① 線程池 : EventLoopGroup 線程池中有多個 EventLoop 線程同時運行 ;
② 線程 : 每個 EventLoop 線程中都有一個 選擇器 Selector 和 TaskQueue 任務隊列 , 控制該線程接受并執(zhí)行任務 ;
③ 線程調度 : 當有任務分配給 EventLoopGroup 線程池時 , 調用 next 方法 , 從 EventLoopGroup 線程池中獲取 EventLoop 線程處理該任務 ;
3 . 服務器端的 EventLoopGroup 示例 :
① 222 線程池 : 服務器端有兩個 EventLoopGroup 線程池 , 分別是 BossGroup 和 WorkerGroup ;
② BossGroup 線程池 : 處理客戶端的連接事件 , 建立與客戶端的連接 ;
③ WorkerGroup 線程池 : 處理客戶端的數(shù)據(jù)交互事件 , 實現(xiàn)客戶端與服務器端的數(shù)據(jù)讀寫 ;
// 1. 創(chuàng)建 BossGroup 線程池 和 WorkerGroup 線程池, 其中維護 NioEventLoop 線程 // NioEventLoop 線程中執(zhí)行無限循環(huán)操作// BossGroup 線程池 : 負責客戶端的連接 // 指定線程個數(shù) : 客戶端個數(shù)很少, 不用很多線程維護, 這里指定線程池中線程個數(shù)為 1 EventLoopGroup bossGroup = new NioEventLoopGroup(1); // WorkerGroup 線程池 : 負責客戶端連接的數(shù)據(jù)讀寫 EventLoopGroup workerGroup = new NioEventLoopGroup();4 . EventLoopGroup 常用方法 :
① 構造方法 : 可以使用無參的構造方法 , 也可以在構造方法參數(shù)中指定線程池線程個數(shù) ;
EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 有參構造方法, 執(zhí)行線程個數(shù) EventLoopGroup workerGroup = new NioEventLoopGroup(); // 無參構造方法 , 默認線程個數(shù), CPU 核數(shù) * 2② 斷開連接方法 : 調用 shutdownGracefully 方法 , 優(yōu)雅地斷開連接 ;
bossGroup.shutdownGracefully();三、 BossGroup 與 WorkerGroup 運行機制
1 . BossGroup 線程池簡述 :
① BossGroup 線程池類型 : BossGroup 的真實類型是 NioEventLoopGroup 類型的 ;
② BossGroup 線程池中線程個數(shù) : BossGroup 線程池一般都只放一個線程 , 如上面代碼中 new NioEventLoopGroup(1) 指定 BossGroup 線程池中線程個數(shù)為 111 ;
③ NioEventLoop 線程 : 該 BossGroup 線程池中的 EventLoop 線程實際類型是 NioEventLoop , 下面開始針對這 111 個 EventLoop 線程進行解析 ;
2 . BossGroup 線程池 建立與客戶端連接 細節(jié) :
① 注冊通道 : NioEventLoop 線程中注冊了 NioServerSocketChannel , 這是服務器端負責建議與客戶端連接的 服務器套接字通道 ;
② NioEventLoop 線程輪詢監(jiān)聽 : NioEventLoop 線程的 選擇器 Selector 監(jiān)聽客戶端的 連接事件 , 監(jiān)聽到之后 , 就會建立與客戶端的連接 ;
③ 建立連接 : 服務器端建立與客戶端的連接 , 最終得到一個 NioSocketChannel 連接通道 , 通過該通道可以與客戶端進行數(shù)據(jù)讀寫交互 ;
此時 BossGroup 線程池任務告一段落 , 將該 NioSocketChannel 套接字通道交給 WorkerGroup 線程池進行處理 ;
3 . WorkerGroup 線程池 接收客戶端連接 細節(jié) :
① 傳遞 NioSocketChannel : BossGroup 線程池中連接建立完成 , 將 NioSocketChannel 傳遞給了 WorkerGroup 線程池 ;
② WorkGroup 線程池概述 : WorkerGroup 線程池中有多個 NioEventLoop 線程 , 每個 NioEventLoop 線程都要維護多個 NioSocketChannel 客戶端套接字通道 ;
③ 選擇線程池 : WorkerGroup 線程池調用 NioEventLoopGroup 的 next 方法 , 選擇一個 NioEventLoop 線程 , 接收這個客戶端套接字通道 NioSocketChannel ;
④ 注冊通道 : 將該 NioSocketChannel 注冊給 NioEventLoop 線程中的 選擇器 Selector , 即可監(jiān)聽該客戶端連接的數(shù)據(jù)讀寫事件 ;
4 . NioEventLoopGroup 線程池選擇線程 next 方法規(guī)則 :
① WorkerGroup 線程池中線程個數(shù) : 默認的線程個數(shù)是 CPU 核數(shù)的 222 倍 , 假設服務器是 444 核的 , 那么默認該線程池中有 888 個線程 ;
② 傳遞 NioSocketChannel : 當 BossGroup 建立連接成功 , 傳遞 NioSocketChannel 給 WorkerGroup 線程池 , WorkerGroup 需要選擇一個 NioEventLoop 線程接收該 NioSocketChannel 客戶端套接字通道 ;
③ 調用 next 方法分配策略 : 線程標號 000 ~ 888 , 第 000 個 NioSocketChannel 分配給第 000 個線程 , 然后第 888 個 NioSocketChannel 分配給第 888 個線程 , 第 999 個 NioSocketChannel 分配給第 000 個線程 ;
總結 : 第 nnn 個線程分配給 n%9n \% 9n%9 個線程 ;
總結
以上是生活随笔為你收集整理的【Netty】Netty 核心组件 ( ChannelOption | EventLoopGroup )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Netty】Netty 核心组件 (
- 下一篇: 【Android RTMP】RTMP 直