Netty是由JBOSS開發的高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸等協議的支持,作為一個異步NIO框架,Netty的所有IO操作都是異步非阻塞的,通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結果。作為當前最流行的NIO框架之一,Netty在互聯網領域、大數據分布式計算領域、游戲行業、通信行業等獲得了廣泛的應用,其服務框架如下:
圖 1 Netty服務框架
Netty是典型的Reactor模型結構,其中常用的Reactor線程模型有三種,分別為:Reactor單線程模型、Reactor多線程模型和主從Reactor多線程模型。而在Netty的線程模型並非固定不變,通過在啟動輔助類中創建不同的EventLoopGroup實例並通過適當的參數配置,就可以支持上述三種Reactor線程模型。
lReactor單線程模型
Reactor單線程模型指的是所有的IO操作都在同一個NIO線程上面完成。作為NIO服務端接收客戶端的TCP連接,作為NIO客戶端向服務端發起TCP連接,讀取通信對端的請求或向通信對端發送消息請求或者應答消息。由於Reactor模式使用的是異步非阻塞IO,所有的IO操作都不會導致阻塞,理論上一個線程可以獨立處理所有IO相關的操作。
圖 2 Netty Reactor單線程模型
lReactor多線程模型
對於一些小容量應用場景,可以使用單線程模型,但是對於高負載、大並發的應用卻不合適,需要對該模型進行改進,演進為Reactor多線程模型。Rector多線程模型與單線程模型最大的區別就是有一組NIO線程處理IO操作。
在該模型中有專門一個NIO線程-Acceptor線程用於監聽服務端,接收客戶端的TCP連接請求;而1個NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1個NIO線程,防止發生並發操作問題。網絡IO操作-讀、寫等由一個NIO線程池負責,線程池可以采用標准的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送。
圖 3 Netty Reactor多線程模型
l主從Reactor多線程模型
在並發極高的情況單獨一個Acceptor線程可能會存在性能不足問題,為了解決性能問題,產生主從Reactor多線程模型。主從Reactor線程模型的特點是:服務端用於接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求處理完成后(可能包含接入認證等),將新創建的SocketChannel注冊到IO線程池(sub reactor線程池)的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用於客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到后端subReactor線程池的IO線程上,由IO線程負責后續的IO操作。
圖 4 Netty主從Reactor多線程模型