Netty權威指南:Java的I/O演進

無敵天驕發表於2021-04-06

在JDK1.4推出 JavaNIO之前,基於Java的所有 Socket通訊都採用了同步阻塞模式(BIO),這種 一請求一應答的通訊模型簡化了上層的應用開發,但是在效能和可靠性方面卻存在著巨大的瓶頸。因此,在很長一段時間裡,大型的應用伺服器都採用C或者C++語言開發,因為它們可以直接使用作業系統提供的非同步I/O或者AIO能力。當併發訪問量增大、響應時間延遲增大之後,採用JavaBIO開發的服務端軟體只有透過硬體的不斷擴容來滿足高併發和低時延,它極大地增加了企業的成本,並且隨著叢集規模的不斷膨脹,系統的可維護性也面臨巨大的挑戰,只能透過採購效能更高的硬體伺服器來解決問題,這會導致惡性迴圈。

正是由於Java傳統BIO的拙劣表現,才使得Java支援非阻塞I/O 的呼聲日漸高漲,最終,JDK1.4 版本提供了新的NIO類庫,Java終於也可以支援非阻塞I/0了。

Java的I/O發展簡史

從JDK1.0到JDK1.3,Java 的 I/O類庫都非常原始,很多UNIX網路程式設計中的概念或者介面在I/O類庫中都沒有體現,例如Pipe、Channel、Buffer 和Selector等。2002 年釋出JDK1.4時,NIO以JSR-51的身份正式隨JDK釋出。它新增了個 java.nio包,提供了很多進行非同步I/O開發的API和類庫,主要的類和介面如下。

  • 進行非同步 I/O操作的緩衝區ByteBuffer等;
  • 進行非同步 I/O操作的管道Pipe;
  • 進行各種 I/O操作(非同步或者同步)的Channel, 包括  ServerSocketChannel 和  SocketChannel
  • 多種字符集的編碼能力和解碼能力;
  • 實現非阻塞 I/O操作的多路複用器selector;
  • 基於流行的 Perl實現的正規表示式類庫;
  • 檔案通道 FileChannel

新的NIO類庫的提供,極大地促進了基於Java的非同步非阻塞程式設計的發展和應用,但是,它依然有不完善的地方,特別是對檔案系統的處理能力仍顯不足,主要問題如下。

  • 提供能夠批次獲取檔案屬性的API,這些API具有平臺無關性,不與特性的檔案系統相耦合。另外它還提供了標準檔案系統的SPI, 供各個服務提供商擴充套件實現;
  • 提供AIO功能,支援基於檔案的非同步I/O操作和針對網路套接字的非同步操作;
  • 完成JSR-51定義的通道功能,包括對配置和多播資料包的支援等。

喜歡這篇文章的朋友們可以關注個人簡介中的公眾號

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2766624/,如需轉載,請註明出處,否則將追究法律責任。

相關文章