天天看點

Netty介紹

Netty是由JBOSS開發的高性能、異步事件驅動的NIO架構,它提供了對TCP、UDP和檔案傳輸等協定的支援,作為一個異步NIO架構,Netty的所有IO操作都是異步非阻塞的,通過Future-Listener機制,使用者可以友善的主動擷取或者通過通知機制獲得IO操作結果。作為目前最流行的NIO架構之一,Netty在網際網路領域、大資料分布式計算領域、遊戲行業、通信行業等獲得了廣泛的應用,其服務架構如下:

Netty介紹

圖 1    Netty服務架構

Netty是典型的Reactor模型結構,其中常用的Reactor線程模型有三種,分别為:Reactor單線程模型、Reactor多線程模型和主從Reactor多線程模型。而在Netty的線程模型并非固定不變,通過在啟動輔助類中建立不同的EventLoopGroup執行個體并通過适當的參數配置,就可以支援上述三種Reactor線程模型。

lReactor單線程模型

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

Netty介紹

圖 2    Netty Reactor單線程模型

lReactor多線程模型

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

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

Netty介紹

圖 3    Netty Reactor多線程模型

l主從Reactor多線程模型

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

Netty介紹

圖 4    Netty主從Reactor多線程模型

本文轉自shishanyuan部落格園部落格,原文連結:http://www.cnblogs.com/shishanyuan/p/6200764.html   ,如需轉載請自行聯系原作者