為什么不建議使用 Java 原生 IO?
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
開(kāi)發(fā)出高質(zhì)量的 NIO 程序并不是一件簡(jiǎn)單的事情。
除去 NIO 固有的復(fù)雜性和 Bug 不談,作為一個(gè) NIO 服務(wù)端,需要能夠處理網(wǎng)絡(luò)的閃斷、客戶端的重復(fù)接入、客戶端的安全認(rèn)證、消息的編解碼、半包讀寫(xiě)等情況, 如果你沒(méi)有足夠的 NIO 編程經(jīng)驗(yàn)積累, 一個(gè) NIO 框架的穩(wěn)定往往需要半年甚至更長(zhǎng)的時(shí)間。
更為糟糕的是,一旦在生產(chǎn)環(huán)境中發(fā)生問(wèn)題,往往會(huì)導(dǎo)致跨節(jié)點(diǎn)的服務(wù)調(diào)用中斷,嚴(yán)重的可能會(huì)導(dǎo)致整個(gè)集群環(huán)境都不可用, 需要重啟服務(wù)器,這種非正常停機(jī)會(huì)帶來(lái)巨大的損失。
從可維護(hù)性角度看,由于 NIO 采用了異步非阻塞編程模型,而且是一個(gè) I/O 線程處理多條鏈路,它的調(diào)試和跟蹤非常麻煩,特別是生產(chǎn)環(huán)境中的問(wèn)題,我們無(wú)法進(jìn)行有效的調(diào)試和跟蹤,往往只能靠一些日志來(lái)幫助分析,定位難度很大。
對(duì)于 Java 原生的 IO 我們之所以不選擇使用是因?yàn)椋?/strong>
NIO的類(lèi)庫(kù)和API繁雜使用麻煩,你需要熟練掌握Selectol,ServerSocketChannel, SocketChannel,ByteBuffer 等。 需妥具備其他的額外技能做制墊,例如熟悉Java 多線程編程。這是因?yàn)镹IO編程涉及到Reactor 模式,你必須對(duì)多錢(qián)程和網(wǎng)絡(luò)編程非常如悉,才能編寫(xiě)出高質(zhì)量的NIO程序。 可靠性能力補(bǔ)齊, 工作量和難度都非常大。例如客戶端面臨斷連重連、網(wǎng)絡(luò)間斷、半包讀寫(xiě)、失敗緩存、網(wǎng)絡(luò)擁塞和異常碼流的處理等問(wèn)題, NI0 編程的特點(diǎn)是功能開(kāi)發(fā)相對(duì)容易,但是可靠性能力補(bǔ)齊的工作量和難度都非常大。 JDK NIO的BUG,比如epoll bug,這個(gè)BUG會(huì)在linux上導(dǎo)致cpu 100%,使得nio server/client不可用,這個(gè)BUG直到j(luò)dk 6u4才解決,但是直到JDK1.7中仍然有這個(gè)問(wèn)題,該問(wèn)題并未被完全解決,只是發(fā)生的頻率降低了而已。
基于上述原因大多數(shù)場(chǎng)景下都不建議直接使原生 NIO,除非你精通 NIO 編程或者是有特殊的需要,否則作為服務(wù)器編程的NIO可能會(huì)帶來(lái)巨大的生產(chǎn)隱患。
關(guān)于Netty:
Netty是一個(gè)高性能、異步事件驅(qū)動(dòng)的NIO框架,它提供了對(duì)TCP、UDP和文件傳輸?shù)闹С郑鳛橐粋€(gè)異步NIO框架,Netty的所有IO操作都是異步非阻塞的,通過(guò)Future-Listener機(jī)制,用戶可以方便的主動(dòng)獲取或者通過(guò)通知機(jī)制獲得IO操作結(jié)果。
作為當(dāng)前最流行的NIO框架,Netty在互聯(lián)網(wǎng)領(lǐng)域、大數(shù)據(jù)分布式計(jì)算領(lǐng)域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應(yīng)用,一些業(yè)界著名的開(kāi)源組件也基于Netty的NIO框架構(gòu)建。
與Netty同樣功能的NIO框架還有Mina,Netty的主導(dǎo)作者與Mina的主導(dǎo)作者是同一人,在設(shè)計(jì)理念上與Mina基本上是一致的。Mina出身于開(kāi)源界的大牛Apache組織,Netty出身于商業(yè)開(kāi)源大亨Jboss。
這幾年Netty社區(qū)相對(duì)比較活躍,所以我們就先選擇Netty作為入手網(wǎng)絡(luò)編程的首選,有時(shí)間再學(xué)習(xí)一下Mina。另外,關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。
參考:《Netty權(quán)威指南 》
作者:rickiyang
出處:www.cnblogs.com/rickiyang/p/11074238.html






關(guān)注Java技術(shù)棧看更多干貨


