1. 程式人生 > >BIO & NIO & NIO常見框架

BIO & NIO & NIO常見框架

BIO & NIO

BIO - Blocking IO - 同步式阻塞式IO --- UDP/TCP

NIO - New  IO - 同步式非阻塞式IO

AIO  - AsynchronousIO - 非同步式非阻塞式IO - jdk1.8

BIO的缺點:

1.會產生阻塞行為 --- receive/accept/connect/read/write

2.一對一的連線:每連線一個客戶端,在伺服器端就需要開啟一個執行緒去處理請求.在客戶端較多的情況下,伺服器端就會產生大量的執行緒 - 耗費記憶體

3.連線建立之後如果不發生任何的操作.那麼就會導致伺服器中的這個執行緒依然被佔用,耗費伺服器的資源

4.無法實現定點操作

NIO的三個基本元件:

Buffer-緩衝區, Channel-通道, Selector-多路複用選擇器

Buffer-緩衝區

容器 - 儲存資料 - 在底層儲存資料的時候實際上是以陣列形式來儲存

capacity - 容量位 - 指定緩衝區的容量

limit - 限制位 - 限制操作位所能達到的尺度

position - 操作位 - 指定要操作的位置

mark - 標記位 - 標記位置,認為標記位置之前的資料是已經操作過的沒有錯誤的資料

mark <= position <= limit <= capacity

flip - 反轉緩衝區:先將限制位挪到操作位上, 然後將操作位歸零, 清空標記位

clear - 清空緩衝區: 將操作位歸零,將limit挪到capacity,將標記位清空

reset - 重置緩衝區: 將操作位挪到標記位

rewind - 重繞緩衝區: 將操作位歸零,將標記位清空 --- 緩衝區多次讀取

Channel-通道

傳輸資料 - 是面向緩衝區的。在java中,Channel預設也是阻塞的,需要手動將其設定為非阻塞模式。

BIO: File、UDP - DatagramSocket、TCP - Socket, ServerSocket

NIO: FileChannel、UDP - DatagramChannel、TCP - SocketChannel, ServerSocketChannel

FileChannel - 操作檔案,可以利用通道實現相同平臺之間的零拷貝技術。

Selector-多路複用選擇器

進行選擇 - 是面向通道進行操作。要求通道在使用的時候必須設定為非阻塞

客戶端

可連線,可讀、可寫

服務端

可接受,可讀,可寫

通過Selector可以實現利用同一個伺服器端來處理多個客戶端的資料 --- 可以用少量執行緒處理大量的請求 --- 在底層處理的時候實際上依然是同步的

NIO的優勢:

1.非阻塞:提高傳輸效率

2.一對多的連線:可以用一個或者少量的伺服器中的執行緒來處理大量的請求,從而節省伺服器的記憶體資源

3.即使已經建立連線,只要沒有對應的讀寫事件,那麼依然不能夠使用伺服器來進行處理

4.利用通道實現資料的雙向傳輸

5.因為利用緩衝區來儲存資料,所以可以對緩衝區中的資料實現定點操作

NIO常見框架比較

一.通訊框架

流行基於Java NIO通訊框架有Mina、Netty、Grizzly等。接下來說下它們之間的對比。 二.它們的出身

Mina出身於開源界的大牛Apache組織;

Netty出身於商業開源大亨Jboss;

Grizzly則出身於Sun公司。

三.它們的設計理念

1、Mina

Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的專案,它為開發高效能

和高可用性的網路應用程式提供了非常便利的框架。當前發行的 Mina 版本2.04支援基於 Java NIO 技術的

TCP/UDP 應用程式開發、串列埠通訊程式,Mina 所支援的功能也在進一步的擴充套件中。 目前,正在使用Mina的應用

包括:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5

Server(Macromedia Flash Media RTMP)、ObjectRADIUS、 Openfire等等。

2、Netty

Netty是一款非同步的事件驅動的網路應用框架和工具,用於快速開發可維護的高效能、高擴充套件性協議伺服器和客戶

端。也就是說,Netty是一個NIO客戶端/伺服器框架,支援快速、簡單地開發網路應用,如協議伺服器和客戶端。

它極大簡化了網路程式設計,如TCP和UDP套接字伺服器。

3、Grizzly

Grizzly是一種應用程式框架,專門解決編寫成千上萬使用者訪問伺服器時候產生的各種問題。使用JAVA NIO作為基

礎,並隱藏其程式設計的複雜性。容易使用的高效能的API。帶來非阻塞socket到協議處理層。利用高效能的緩衝和緩

衝管理使用高效能的執行緒池。

從設計的理念上來看,Mina的設計理念是最為優雅的。當然,由於Netty的主導作者與Mina的主導作者是同一人,

出自同一人之手的Netty在設計理念上與Mina基本上是一致的。而Grizzly在設計理念上就較差了點,幾乎是

JavaNIO的簡單封裝。

四.Netty為什麼這麼火?

Netty是目前最流行的由JBOSS提供的一個Java開源框架NIO框架,Netty提供非同步的、事件驅動的網路應用程式框

架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。 相比JDK原生NIO,Netty提供了相對十分

簡單易用的API,非常適合網路程式設計。Netty是完全基於NIO實現的,所以Netty是非同步的。

作為一個非同步NIO框架,Netty的所有IO操作都是非同步非阻塞的,通過Future-Listener機制,使用者可以方便的主動

獲取或者通過通知機制獲得IO操作結果。

Netty無疑是NIO的老大,它的健壯性、功能、效能、可定製性和可擴充套件性在同類框架都是首屈一指的。它已經得

到成百上千的商業/商用專案驗證,如Hadoop的RPC框架Avro、RocketMQ以及主流的分散式通訊框架Dubbo等

等。 為什麼這麼火,是有原因的。

Netty的優點可以總結如下:

API使用簡單,開發門檻低;

功能強大,預置了多種編解碼功能,支援多種主流協議;

定製能力強,可以通過ChannelHandler對通訊框架進行靈活地擴充套件;

效能高,通過與其他業界主流的NIO框架對比,Netty的綜合性能最優;

成熟、穩定,Netty修復了已經發現的所有JDK NIO BUG,業務開發人員不需要再為NIO的BUG而煩

惱;

社群活躍,版本迭代週期短,發現的BUG可以被及時修復,同時,更多的新功能會加入;

經歷了大規模的商業應用考驗,質量得到驗證。在網際網路、大資料、網路遊戲、企業應用、電信軟體等

眾多行業得到成功商用,證明了它已經完全能夠滿足不同行業的商業應用了。

與Mina相比有什麼優勢:

1. 都是Trustin Lee的作品,Netty更晚;

2. Mina將核心和一些特性的聯絡過於緊密,使得使用者在不需要這些特性的時候無法脫離,相比下效能會有

所下降,Netty解決了這個設計問題;

3. Netty的文件更清晰,很多Mina的特性在Netty裡都有;

4. Netty更新週期更短,新版本的釋出比較快;

5. 它們的架構差別不大,Mina靠apache生存,而Netty靠jboss,和jboss的結合度非常高,Netty有對

google protocal buf的支援,有更完整的ioc容器支援(spring,guice,jbossmc和osgi);

6. Netty比Mina使用起來更簡單,Netty裡你可以自定義的處理upstream events或/和downstream

events,可以使用decoder和encoder來解碼和編碼傳送內容;

7. Netty和Mina在處理UDP時有一些不同,Netty將UDP無連線的特性暴露出來;而Mina對UDP進行了高

級層次的抽象,可以把UDP當成"面向連線"的協議,而要Netty做到這一點比較困難。

8. 從任務排程粒度上看,mina會將有IO任務的session寫入佇列中,當迴圈執行任務時,則會輪詢所有的

session,並依次把session中的所有任務取出來執行。這樣粗粒度的排程是不公平排程,會導致某些請

求的延遲很高。