Netty介紹


Netty是由JBOSS開發的高性能、異步事件驅動的NIO框架,它提供了對TCPUDP和文件傳輸等協議的支持,作為一個異步NIO框架,Netty的所有IO操作都是異步非阻塞的,通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結果。作為當前最流行的NIO框架之一,Netty在互聯網領域、大數據分布式計算領域、游戲行業、通信行業等獲得了廣泛的應用,其服務框架如下:

clip_image002[4]

圖 1    Netty服務框架

Netty是典型的Reactor模型結構,其中常用的Reactor線程模型有三種,分別為:Reactor單線程模型、Reactor多線程模型和主從Reactor多線程模型。而在Netty的線程模型並非固定不變,通過在啟動輔助類中創建不同的EventLoopGroup實例並通過適當的參數配置,就可以支持上述三種Reactor線程模型。

lReactor單線程模型

Reactor單線程模型指的是所有的IO操作都在同一個NIO線程上面完成。作為NIO服務端接收客戶端的TCP連接,作為NIO客戶端向服務端發起TCP連接,讀取通信對端的請求或向通信對端發送消息請求或者應答消息。由於Reactor模式使用的是異步非阻塞IO,所有的IO操作都不會導致阻塞,理論上一個線程可以獨立處理所有IO相關的操作。

clip_image004[4]

圖 2    Netty Reactor單線程模型

lReactor多線程模型

對於一些小容量應用場景,可以使用單線程模型,但是對於高負載、大並發的應用卻不合適,需要對該模型進行改進,演進為Reactor多線程模型。Rector多線程模型與單線程模型最大的區別就是有一組NIO線程處理IO操作。

在該模型中有專門一個NIO線程-Acceptor線程用於監聽服務端,接收客戶端的TCP連接請求;而1NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1NIO線程,防止發生並發操作問題。網絡IO操作-讀、寫等由一個NIO線程池負責,線程池可以采用標准的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送。

clip_image006[4]

圖 3    Netty Reactor多線程模型

l主從Reactor多線程模型

在並發極高的情況單獨一個Acceptor線程可能會存在性能不足問題,為了解決性能問題,產生主從Reactor多線程模型。主從Reactor線程模型的特點是:服務端用於接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求處理完成后(可能包含接入認證等),將新創建的SocketChannel注冊到IO線程池(sub reactor線程池)的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用於客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到后端subReactor線程池的IO線程上,由IO線程負責后續的IO操作。

clip_image008[4]

圖 4    Netty主從Reactor多線程模型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM