1. 程式人生 > >Netty高效能大容量Socket併發 二

Netty高效能大容量Socket併發 二

Netty簡介

Netty是由JBOSS提供的一個Java開源框架。Netty提供非同步的、事件驅動的網路應用程式框架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。和傳統BIO不同,NIO是非阻塞的,和傳統BIO不同,NIO相當於是執行緒池方式的BIO,相比BIO一個連線一個執行緒,NIO能支援更多的連線。BIO適合流量很高的應用,如檔案傳輸,NIO適合流量不高,但是併發很高的應用,如聊天、推送。如果既要高併發,又要高流量的可以選擇AIO。

Netty隨著最近幾年的發展,特別是跟著雲端計算大資料的流行,很多開源分散式框架都使用了Netty作為通訊框架,如:Hadoop、Storm、

Spark、Facebook、Twitter、阿里巴巴都在使用的Java高效能NIO通訊框架,Netty經過多年打磨,其穩定性和效能達到了非常高的程度。

Netty架構


Netty之所以能夠提供高併發和高效能的通訊,主要是由以下原因形成的:

  1. 零拷貝記憶體池;
  2. 非同步非阻塞通訊模型;
  3. 高效的Reactor執行緒模型;
  4. 無鎖化的序列設計;
  5. 高效的併發程式設計;
  6. 高效能的序列化框架;

Netty三個核心元件:Buffer(快取)、Channel(通道)和ChannelEvent(事件模型)

Netty的快取分為堆記憶體(HeapByteBuf)和直接記憶體(DirectByteBuf)緩衝區。堆記憶體緩衝區的特點是分配和回收速度快,可以被JVM自動回收,缺點是進行Socket的IO讀寫,需要額外進行一次記憶體複製,將堆記憶體對應的緩衝區複製到核心中,效能會有一定程度的下降;直接記憶體緩衝區的特點是非堆記憶體,,它在堆外進行記憶體分配,相比於堆記憶體,它的分配和回收速度會慢一些,但是將它寫入或者從Socket Channel中讀取時,由於少了一次記憶體複製,速度比堆記憶體快。 Channel包括但不限於網路的讀、寫,客戶端發起連線,主動關閉連線,鏈路關閉,獲取通訊雙方的網路地址等,封裝了Socket的操作。當有Socket操作發生時,會觸發事件響應操作,主要操作包括channelRead、channelReadComplete、exceptionCaught等方法,還包括連線建立和斷開等事件。 Netty正是通過Buffer、Channel、ChannelEvent等的封裝,實現了高效率,簡單易用的Socket併發方案,其程式設計簡單,預設使用的類都具有很好的效率。