爲何不建議使用 Java 原生 NIO?

做者:rickiyang

出處:www.cnblogs.com/rickiyang/p/11074238.htmlhtml

開發出高質量的 NIO 程序並非一件簡單的事情。java

除去 NIO 固有的複雜性和 Bug 不談,做爲一個 NIO 服務端,須要可以處理網絡的閃斷、客戶端的重複接入、客戶端的安全認證、消息的編解碼、半包讀寫等狀況, 若是你沒有足夠的 NIO 編程經驗積累, 一個 NIO 框架的穩定每每須要半年甚至更長的時間。linux

更爲糟糕的是,一旦在生產環境中發生問題,每每會致使跨節點的服務調用中斷,嚴重的可能會致使整個集羣環境都不可用, 須要重啓服務器,這種非正常停機會帶來巨大的損失。面試

從可維護性角度看,因爲 NIO 採用了異步非阻塞編程模型,並且是一個 I/O 線程處理多條鏈路,它的調試和跟蹤很是麻煩,特別是生產環境中的問題,咱們沒法進行有效的調試和跟蹤,每每只能靠一些日誌來幫助分析,定位難度很大。spring

對於 Java 原生的 IO 咱們之因此不選擇使用是由於:編程

  1. NIO的類庫和API繁雜使用麻煩,你須要熟練掌握Selectol,ServerSocketChannel,
    SocketChannel,ByteBuffer 等。
  2. 需妥具有其餘的額外技能作制墊,例如熟悉Java 多線程編程。這是由於NIO編程涉及到Reactor 模式,你必須對多錢程和網絡編程很是如悉,才能編寫出高質量的NIO程序。
  3. 可靠性能力補齊, 工做量和難度都很是大。例如客戶端面臨斷連重連、網絡間斷、半包讀寫、失敗緩存、網絡擁塞和異常碼流的處理等問題, NI0 編程的特色是功能開發相對容易,可是可靠性能力補齊的工做量和難度都很是大。
  4. JDK NIO的BUG,好比epoll bug,這個BUG會在linux上致使cpu 100%,使得nio server/client不可用,這個BUG直到jdk 6u4才解決,可是直到JDK1.7中仍然有這個問題,該問題並未被徹底解決,只是發生的頻率下降了而已。

基於上述緣由大多數場景下都不建議直接使原生 NIO,除非你精通 NIO 編程或者是有特殊的須要,不然做爲服務器編程的NIO可能會帶來巨大的生產隱患。緩存

關於Netty:安全

Netty是一個高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸的支持,做爲一個異步NIO框架,Netty的全部IO操做都是異步非阻塞的,經過Future-Listener機制,用戶能夠方便的主動獲取或者經過通知機制得到IO操做結果。服務器

做爲當前最流行的NIO框架,Netty在互聯網領域、大數據分佈式計算領域、遊戲行業、通訊行業等得到了普遍的應用,一些業界著名的開源組件也基於Netty的NIO框架構建。網絡

與Netty一樣功能的NIO框架還有Mina,Netty的主導做者與Mina的主導做者是同一人,在設計理念上與Mina基本上是一致的。Mina出身於開源界的大牛Apache組織,Netty出身於商業開源大亨Jboss。

這幾年Netty社區相對比較活躍,因此咱們就先選擇Netty做爲入手網絡編程的首選,有時間再學習一下Mina。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上全部 Mock 工具!

4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

以爲不錯,別忘了隨手點贊+轉發哦!

相關文章
相關標籤/搜索