Netty:一個非阻塞的客戶端/服務器框架

jopen 10年前發布 | 38K 次閱讀 Netty 網絡工具包

Netty是一個異步事件驅動的網絡應用框架,為Java網絡應用的開發帶來了一些新活力。Netty由協議服務器和客戶端所組成,可用于快速開發可維護的高性能軟件。Netty應用框架及其工具簡化了網絡編程,而且由Netty社區進行維護。

20141016171205671.jpg

Netty還被歸類為NIO客戶端/服務器框架,用它能夠快速、簡易地開發網絡應用,使得TCP和UDP套接字服務器的網絡編程得以簡化和更加合理。

內建的HTTP協議支持WebSocket,允許框架運行在Servlet容器內。新版的Netty同時支持非阻塞I/O和阻塞I/O通信。

Netty的特性:

1、傳輸服務包括:套接字和數據報、HTTP通道、虛擬機內部管道

2、協議支持以下擴展:HTTP、Web Socket、Google Protocol Buffer、SSL-StartTLS、大文件傳輸、RTSP、Zlib或gzip壓縮、二進制協議、其它遺留的文本格式

3、核心:可擴展的事件模型、統一通信API、零拷貝能力的富字節緩沖

Netty設計:

Netty 在設計上針對多種傳輸類型,集成了一套統一的API、阻塞和非阻塞的套接字。Netty的事件模型是可擴展的,可以把關注點進行明確隔離。Netty的線程模型提供了在單線程或類SEDA這樣的線程池之間選擇的靈活性,而且線程是高可自定義的,對數據報的支持實現了真正的無連接通信,Netty的管道抽象與安全線程、動態可變性相結合,使得框架得到有力支撐。

注:SEDA,即Staged Event Driven Architecture,階段化的事件驅動架構。SEDA的思路是將原先由一個線程完成的任務,分割為相對獨立的多個階段。每個階段由專用的一組線程負責執行,階段之間用過隊列交互。采用SEDA方式,只有在并發量提高到一定程度,并發成為系統瓶頸時才能體現價值。就單個操作而言,由于隊列的傳遞,其延遲一定是有所上升的。

可以參考這篇論文《SEDA: an Architecture for Well-Conditioned, Scalable Internet Services

SEDA是加州大學伯克利分校研究的一套優秀的高性能互聯網服務器架構模型,其設計目標是:支持大規模并發處理、簡化系統開發、支持處理監測、支持系統資源管理。

兩種目前廣泛使用的網絡服務器架構模型:

1)多線程服務器(Threaded Server)

工作原理:對于每一個request,dispatcher都會為其創建并分配一個線程,該線程負責這個請求的處理。此方式又名為(Thread-per-request)。

20141016171345796.jpg

優點:執行粒度是整個完整的處理流程,處理邏輯清晰,易于開發。
缺點:當隨著處理請求的不斷增加,會導致并發執行的線程數量太多。過多的線程數量會導致系統在線程調度和資源爭用上的開銷過大,從而引起系統性能急劇下降,導致系統處理能力下降。
改進措施:引入線程池(Bounded Thread Pools)
系統最多只能創建一定數量的線程。當所有線程都飽和運行時,新到達的處理請求只能等待,或者被拋棄。
缺點:執行粒度仍然是完整的處理流程,難以檢測系統性能瓶頸的根源以及進行相應調整。

2)事件驅動并發處理(Event-Driven Concurrency)

將處理流程分割成多個步驟,每一個步驟都實現為一個有限狀態機(FSM)。
工作原理:所有的處理請求會作為Event進入系統,由Scheduler負責傳遞給相應FSM。FSM的處理結果也以Event形式輸出給Scheduler。新的Event會再次被Scheduler進行轉發給下一個FSM,直至處理完成。

20141016171759336.jpg

優點:
1、隨著處理量的增加,系統負荷是以線形增長。當達到系統飽和處理能力后,系統的處理能力不會下降。
2、由于將各處理步驟獨立實現,易于進行系統監測和調整。
缺點:
Scheduler的設計和實現過于復雜,針對于不同的應用和系統的邏輯變更需要不同的實現。

 

SEDA架構

 (近似于Event-Driven Concurrency,但是沒有其中的Scheduler)將每一個處理步驟獨立為一個Stage。

20141016171826901.jpg

Stage結構:
1)一個接受輸入的Event Queue;
2)一個應用開發者編寫的Event Handler;
3)一個Controller用于對執行過程進行控制。包括并發線程數量、批處理數量等等;
4)一個Thread Pool用于并發處理;
Stage的輸入通過Event Queue獲得。Stage的輸出會以Event形式推送到其他Stage的Event Queue中。Stage之間的這種連接關系由應用開發人員指定。
帶來的問題:Event Queue盡管減少了模塊間的耦合性,但是會降低響應速度。

 

性能及有效性:

Netty不僅提供了良好的穩定性,還提供了更好的吞吐量和更低的延遲性能,把內存復制限制到最低需求上,零拷貝能力富字節緩沖特性使內核能夠管理DMA復制。這減少了CPU和系統總線的負擔,提升了框架的有效性。

可擴展性與集成:

Netty 有可擴展能力,支持擴展到上千種連接類型,而且在維持有效性的同時沒有性能瓶頸。這些連接的可靠性都非常高,而且不會失效。Netty易于擴展和構建。 Netty還提供了靈活的集成性能,可以與很多環境比如Linux、Java、C#、C++、Python等環境集成。

安全:Netty提供了完整的SSL/TLS和StartTLS支持。

Netty官方提供了很多指南、文檔以及JavaDoc和例子供開發者參考。

Netty目前的最新穩定版是4.0.23版。

下載地址: http://dl.bintray.com/netty/downloads/netty-4.0.23.Final.tar.bz2

作者:chszs,轉載需注明。博客主頁:
http://blog.csdn.net/chszs

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!