作者:rickiyang
出處:www.cnblogs.com/rickiyang/p/11074238.html
開發出高質量的 NIO 程式并不是一件簡單的事情,
除去 NIO 固有的復雜性和 Bug 不談,作為一個 NIO 服務端,需要能夠處理網路的閃斷、客戶端的重復接入、客戶端的安全認證、訊息的編解碼、半包讀寫等情況, 如果你沒有足夠的 NIO 編程經驗積累, 一個 NIO 框架的穩定往往需要半年甚至更長的時間,
更為糟糕的是,一旦在生產環境中發生問題,往往會導致跨節點的服務呼叫中斷,嚴重的可能會導致整個集群環境都不可用, 需要重啟服務器,這種非正常停機會帶來巨大的損失,
從可維護性角度看,由于 NIO 采用了異步非阻塞編程模型,而且是一個 I/O 執行緒處理多條鏈路,它的除錯和跟蹤非常麻煩,特別是生產環境中的問題,我們無法進行有效的除錯和跟蹤,往往只能靠一些日志來幫助分析,定位難度很大,
對于 Java 原生的 IO 我們之所以不選擇使用是因為:
- NIO的類別庫和API繁雜使用麻煩,你需要熟練掌握Selectol,ServerSocketChannel,
SocketChannel,ByteBuffer 等, - 需妥具備其他的額外技能做制墊,例如熟悉Java 多執行緒編程,這是因為NIO編程涉及到Reactor 模式,你必須對多錢程和網路編程非常如悉,才能撰寫出高質量的NIO程式,
- 可靠性能力補齊, 作業量和難度都非常大,例如客戶端面臨斷連重連、網路間斷、半包讀寫、失敗快取、網路擁塞和例外碼流的處理等問題, NI0 編程的特點是功能開發相對容易,但是可靠性能力補齊的作業量和難度都非常大,
- 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開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/287031.html
標籤:其他
下一篇:題解-P3810
