BIO/AIO/NIO

NIO通常採用Reactor模式,AIO通常採用Proactor模式。AIO簡化了程序的編寫,stream的讀取和寫入都有OS來完成,不需 要像NIO那樣子遍歷Selector。Windows基於IOCP實現AIO,Linux只有eppoll模擬實現了AIO。

Java7之前的JDK只支持NIO和BIO,從7開始支持AIO。

4種通信方式:TCP/IP+BIO, TCP/IP+NIO, UDP/IP+BIO, UDP/IP+NIO。

  • TCP/IP+BIO、

Socket和ServerSocket實現,ServerSocket實現Server端端口監聽,Socket用於建立網絡IO連接。

不適用於處理多個請求 1.生成Socket會消耗過多的本地資源。2. Socket連接的建立一般比較慢。

BIO情況下,能支持的連接數有限,一般都採取accept獲取Socket以後採用一個thread來處理,one connection one thread。無論連接是否有真正數據請求,都需要獨佔一個thread。

可以通過設立Socket池來一定程度上解決問題,但是使用池需要注意的問題是:1. 競爭等待比較多。 2. 需要控制好超時時間。

  • TCP/IP+NIO

使用Channel(SocketChannel和ServerSocketChannel)和Selector。

Server端通常由一個thread來監聽connect事件,另外多個thread來監聽讀寫事件。這樣做的好處是這些連接只有在真是請求的時 候纔會創建thread來處理,one request one thread。這種方式在server端需要支持大量連接但這些連接同時發送請求的峯值不會很多的時候十分有效。

  • UDP/IP+BIO

DatagramSocket和DatagramPacket。DatagramSocket負責監聽端口以及讀寫數據,DatagramPacket作爲數據流對象進行傳輸。

UDP/IP是無連接的,無法進行雙向通信,除非雙方都成爲UDP Server。

  • UDP/IP+NIO

通過DatagramChannel和ByteBuffer實現。DatagramChannel負責端口監聽及讀寫。ByteBuffer負責數據流傳輸。

如果要將消息發送到多臺機器,如果爲每個目標機器都建立一個連接的話,會有很大的網絡流量壓力。這時候可以使用基於UDP/IP的Multicast協議傳輸,Java中可以通過MulticastSocket和DatagramPacket來實現。

Multicast一般多用於多臺機器的狀態同步,比如JGroups。SRM, URGCP都是Multicast的實現方式。eBay就採用SRM來實現將數據從主數據庫同步到各個搜索節點機器。



補充:http://blog.csdn.net/fenterpriser/article/details/6331735

               http://blog.sina.com.cn/s/blog_6145ed810100xvqa.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章