Netty 一個非阻塞的客戶端/伺服器框架
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Netty:一個非阻塞的客戶端/伺服器框架
作者:chszs,轉載需註明。部落格主頁:http://blog.csdn.net/chszs
Netty是一個非同步事件驅動的網路應用框架,為Java網路應用的開發帶來了一些新活力。Netty由協議伺服器和客戶端所組成,可用於快速開發可維護的高效能軟體。Netty應用框架及其工具簡化了網路程式設計,而且由Netty社群進行維護。
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)。
優點:執行粒度是整個完整的處理流程,處理邏輯清晰,易於開發。
缺點:當隨著處理請求的不斷增加,會導致併發執行的執行緒數量太多。過多的執行緒數量會導致系統線上程排程和資源爭用上的開銷過大,從而引起系統性能急劇下降,導致系統處理能力下降。
改進措施:引入執行緒池(Bounded Thread Pools)
系統最多隻能建立一定數量的執行緒。當所有執行緒都飽和執行時,新到達的處理請求只能等待,或者被拋棄。
缺點:執行粒度仍然是完整的處理流程,難以檢測系統性能瓶頸的根源以及進行相應調整。
2)事件驅動併發處理(Event-Driven Concurrency)
將處理流程分割成多個步驟,每一個步驟都實現為一個有限狀態機(FSM)。
工作原理:所有的處理請求會作為Event進入系統,由Scheduler負責傳遞給相應FSM。FSM的處理結果也以Event形式輸出給Scheduler。新的Event會再次被Scheduler進行轉發給下一個FSM,直至處理完成。
優點:
1、隨著處理量的增加,系統負荷是以線形增長。當達到系統飽和處理能力後,系統的處理能力不會下降。
2、由於將各處理步驟獨立實現,易於進行系統監測和調整。
缺點:
Scheduler的設計和實現過於複雜,針對於不同的應用和系統的邏輯變更需要不同的實現。
SEDA架構
(近似於Event-Driven Concurrency,但是沒有其中的Scheduler)將每一個處理步驟獨立為一個Stage。
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