2.Netty入門第二章——NIO介紹

1. 同步阻塞BIO

  1. serversocket負責綁定IP和Port胎署,socket負責發(fā)起連接操作。連接成功后诱担,通過輸入/輸出流進行同步阻塞式通信毡证。
  2. 傳統(tǒng)請求-應答模型,Acceptor線程每接受一個請求蔫仙,創(chuàng)建一個線程處理請求并返回料睛。

2. 偽異步IO

  1. 后來考慮到高性能/高并發(fā)場景,演進了用線程池/消息隊列實現(xiàn)1個或多個線程處理N個客戶端摇邦。但底層通信機制仍是同步阻塞IO恤煞,故稱作“偽異步”。線程池中的線程數(shù)量和隊列大小可控施籍,因此不會導致資源耗盡和宕機居扒。
  2. 弊端:JDK的API文檔中,對于InputStream和OutputStream中的read(byte[] b)和write(byte[] b)操作丑慎,都是同步阻塞的喜喂,亦即一直阻塞直到發(fā)生如下事件:
  3. 有數(shù)據(jù)可讀。
  4. 讀到數(shù)據(jù)末尾竿裂。
  5. 發(fā)生空指針或IO異常玉吁。

如果大量連接上來,前端只有一個Acceptor線程接入請求腻异,那么进副,之前的請求在線程池中的隊列(阻塞隊列實現(xiàn))中排隊,隊列滿悔常,入隊操作阻塞影斑,新請求將被拒絕。破解這一難題这嚣,NIO入場鸥昏。

3. NIO編程

官方New IO,更多人接受Non-block IO.與Socket和ServerSocket類似,NIO提供了SocketChannel和ServerSocketChannel套接字通道實現(xiàn)姐帚,且支持阻塞非阻塞模式吏垮。

3.1. 緩沖區(qū)Buffer

在NIO中,所有的數(shù)據(jù)操作都是面對緩沖區(qū)的,從緩沖區(qū)讀膳汪,往緩沖區(qū)寫唯蝶。實現(xiàn)原理是數(shù)組

3.2. 通道Channel

通道與流的不同遗嗽,在于通道是雙向的粘我,而流是單向的。通道可用于讀痹换、寫征字、同時讀寫。同時支持阻塞和非阻塞模式娇豫。

3.3. 多路復用器Selector

多路選擇器提供了選擇已經(jīng)就緒的任務的能力匙姜。Selector會不斷輪詢注冊其上的Channel,如果某個Channel上有新的TCP連接冯痢、讀氮昧、寫事件,這個Channel就處于就緒狀態(tài)浦楣,會被Selector輪詢出來袖肥。JDK使用了epoll()代替了select()實現(xiàn),沒有最大連接句柄數(shù)1024/2048的限制振劳,一般1GB內存支持100 000個連接椎组。

4. AIO 編程

NIO2.0引入新的異步通道的概念,并提供了異步文件通道和異步套接字通道的實現(xiàn)澎迎。是真正的異步非阻塞IO庐杨,對應unix的事件驅動IO(AIO),不需要Selector對其輪詢即可實現(xiàn)異步讀寫夹供。

5. 總結

5.1. 不選擇原生NIO編程原因

  1. NIO類庫和API非常負責灵份,使用麻煩。
  2. 需具備其他技能做鋪墊哮洽,如Java多線程編程填渠,Reactor模式等。
  3. 可靠性不夠鸟辅,如客戶端斷連重連氛什,網(wǎng)絡閃斷,半包讀寫匪凉,失敗緩存等枪眉。
  4. JDK的NIO bug,如epoll bug再层,它會導致Selector空輪詢贸铜,導致CPU使用率100%堡纬。

5.2. 為什么選擇Netty

  1. API使用簡單,開發(fā)門檻低蒿秦。
  2. 功能強大烤镐,預置了多種編解碼功能,支持主流協(xié)議棍鳖。
  3. 定制能力強炮叶。
  4. 性能高。
  5. 成熟穩(wěn)定渡处,修復了已發(fā)現(xiàn)的所有NIO bug镜悉。
  6. 社區(qū)活躍,版本迭代周期短骂蓖。
  7. 經(jīng)過了大規(guī)模的商用考驗积瞒。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市登下,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叮喳,老刑警劉巖被芳,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馍悟,居然都是意外死亡畔濒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門锣咒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侵状,“玉大人,你說我怎么就攤上這事毅整∪ば郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵悼嫉,是天一觀的道長艇潭。 經(jīng)常有香客問我,道長戏蔑,這世上最難降的妖魔是什么蹋凝? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮总棵,結果婚禮上鳍寂,老公的妹妹穿的比我還像新娘。我一直安慰自己情龄,他們只是感情好迄汛,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布候味。 她就那樣靜靜地躺著,像睡著了一般隔心。 火紅的嫁衣襯著肌膚如雪白群。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天硬霍,我揣著相機與錄音帜慢,去河邊找鬼。 笑死唯卖,一個胖子當著我的面吹牛粱玲,可吹牛的內容都是我干的。 我是一名探鬼主播拜轨,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抽减,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了橄碾?” 一聲冷哼從身側響起卵沉,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎法牲,沒想到半個月后史汗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡拒垃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年停撞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼瓮。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡戈毒,死狀恐怖,靈堂內的尸體忽然破棺而出横堡,到底是詐尸還是另有隱情埋市,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布翅萤,位于F島的核電站恐疲,受9級特大地震影響,放射性物質發(fā)生泄漏套么。R本人自食惡果不足惜培己,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胚泌。 院中可真熱鬧省咨,春花似錦、人聲如沸玷室。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敌蜂,卻和暖如春箩兽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背章喉。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工汗贫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秸脱。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓落包,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摊唇。 傳聞我的和親對象是個殘疾皇子咐蝇,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java I...
    JackChen1024閱讀 7,555評論 1 143
  • NIO(Non-blocking I/O巷查,在Java領域有序,也稱為New I/O),是一種同步非阻塞的I/O模型吮便,也...
    閃電是只貓閱讀 3,116評論 0 7
  • 這兩天了解了一下關于NIO方面的知識笔呀,網(wǎng)上關于這一塊的介紹只是介紹了一下基本用法,沒有系統(tǒng)的解釋NIO與阻塞髓需、非阻...
    Ruheng閱讀 7,127評論 5 48
  • 作者: 一字馬胡 轉載標志 【2017-11-24】 更新日志 一廷区、Java OIO Java OIO (Jav...
    一字馬胡閱讀 1,352評論 0 12
  • 簡介 Java NIO 是由 Java 1.4 引進的異步 IO.Java NIO 由以下幾個核心部分組成: Ch...
    永順閱讀 1,791評論 0 15