<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么不建議使用 Java 原生 IO?

          共 1539字,需瀏覽 4分鐘

           ·

          2021-06-08 04:41

          點(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>

          1. NIO的類(lèi)庫(kù)和API繁雜使用麻煩,你需要熟練掌握Selectol,ServerSocketChannel, SocketChannel,ByteBuffer 等。
          2. 需妥具備其他的額外技能做制墊,例如熟悉Java 多線程編程。這是因?yàn)镹IO編程涉及到Reactor 模式,你必須對(duì)多錢(qián)程和網(wǎng)絡(luò)編程非常如悉,才能編寫(xiě)出高質(zhì)量的NIO程序。
          3. 可靠性能力補(bǔ)齊, 工作量和難度都非常大。例如客戶端面臨斷連重連、網(wǎng)絡(luò)間斷、半包讀寫(xiě)、失敗緩存、網(wǎng)絡(luò)擁塞和異常碼流的處理等問(wèn)題, NI0 編程的特點(diǎn)是功能開(kāi)發(fā)相對(duì)容易,但是可靠性能力補(bǔ)齊的工作量和難度都非常大。
          4. 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ù)棧看更多干貨



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久免费少妇视频 | 国产资源在线观看 | 91亚洲国产成人精品一区 | 日韩黄色电影看看 | 蜜桃无码AV |