為什么要使用NETTY

JAVA NIO相對于Old IO APIs 有非常大的改進,但是使用NIO是受限制的庭再。有些是設(shè)計問題捞奕,有些是缺陷導致,而netty已經(jīng)解決了這些問題拄轻。

①跨平臺與兼容性

NIO算是底層的APIs需依賴奧佐系統(tǒng)的IO APIs颅围。但Jvava NIO發(fā)現(xiàn)在不同系統(tǒng)平臺會出現(xiàn)問題。大量測試也耗不少時間恨搓;NIO2只支持JDK1.7+院促,而且沒提供DatagramSocket,故NIO2不支持UDP協(xié)議斧抱。

而Netty提供統(tǒng)一接口常拓,同一語句無論在JDK6.X 還是JDK7.X 都可運行,無需關(guān)心底層架構(gòu)功能辉浦!

②JAVA NIO的ByteBuffer構(gòu)造函數(shù)私有弄抬,無法擴展。Netty提供了自己的ByteBuffer實現(xiàn)宪郊,通過簡單APIs對其進行構(gòu)造掂恕、使用和操作荔茬,一此解決NIO的一些限制。

③NIO對緩沖區(qū)的聚合與分散操作可能會導致內(nèi)存泄漏竹海。

直到JDK1.7才解決此問題。

④壓碎著名的Epoll缺陷丐黄。

On Linux-like OSs the selector makes use of the epoll- IO event notification facility. This is a high-performance technique in which the OS works asynchronously with the networking stack.Unfortunately,? even? today? the “famous” epoll- bug? can? lead? to? an “invalid” state? in? the selector, resulting in 100% CPU-usage and spinning. The only way to recover is to recycle the old? selector? and? transfer? the? previously? registered? Channel? instances? to? the? newly? created Selector.

Linux-like OSs的選擇器使用的是epoll-IO事件通知工具斋配。這是一個在操作系統(tǒng)以異步方式工作的網(wǎng)絡(luò)stack.Unfortunately,即使是現(xiàn)在灌闺,著名的epoll-bug也可能會導致無效的狀態(tài)的選擇和100%的CPU利用率艰争。要解決epoll-bug的唯一方法是回收舊的選擇器,將先前注冊的通道實例轉(zhuǎn)移到新創(chuàng)建的選擇器上桂对。

What? happens? here? is? that? the Selector.select() method? stops? to? block? and? returns immediately-even? if? there? are? no? selected? SelectionKeys? present.? This? is? against? the contract,? which? is? in? the? Javadocs? of? the? Selector.select()? method:Selector.select() must not unblock if nothing is selected.

這里發(fā)生的是甩卓,不管有沒有已選擇的SelectionKey,Selector.select()方法總是不會阻塞并且會立刻返回蕉斜。這違反了Javadoc中對Selector.select()方法的描述逾柿,Javadoc中的描述:Selector.select() must not unblock if nothing is selected. (Selector.select()方法若未選中任何事件將會阻塞。)

The range of solutions to this epoll- problem is limited, but Netty attempts to automatically detect and prevent it. The following listing is an example of the epoll- bug.

NIO中對epoll問題的解決方案是有限制的宅此,Netty提供了更好的解決方案机错。

下面是epoll-bug的一個例子:

while (true) {

int selected = selector.select();

Set readyKeys = selector.selectedKeys();

Iterator iterator = readyKeys.iterator();

while (iterator.hasNext()) {

}

}

The effect of this code is that the while loop eats CPU:

這段代碼的作用是while循環(huán)消耗CPU:

while (true) {

}

The value will never be false, and the code keeps your CPU spinning and eats resources. This can have some undesirable side effects as it can consume all of your CPU, preventing any other CPU-bound work.

該值將永遠是假的,代碼將持續(xù)消耗你的CPU資源父腕。這會有一些副作用弱匪,因為CPU消耗完了就無法再去做其他任何的工作。

These are only a few of the possible problems you may see while using non-blocking IO. Unfortunately, even after years of development in this area, issues still need to be resolved; thankfully, Netty addresses them for you.

這些僅僅是在使用NIO時可能會出現(xiàn)的一些問題璧亮。不幸的是萧诫,雖然在這個領(lǐng)域發(fā)展了多年,問題依然存在枝嘶;幸運的是帘饶,Netty給了你解決方案。

⑤ Summary

This chapter provided an overview of Netty’s features, design and benefits. I discussed the difference between blocking and non-blocking processing to give you a fundamental understanding of the reasons to use a non-blocking framework. You learned how to use the JDK API to write network code in both blocking and non-blocking modes. This included the new non-blocking API, which comes with JDK 7. After seeing the NIO APIs in action, it was also important to understand some of the known issues that you may run into. In fact, this is why so many people use Netty: to take care of workarounds and other JVM quirks. In the next chapter, you’ll learn the basics of the Netty API and programming model, and, finally, use Netty to write some useful code.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躬络,一起剝皮案震驚了整個濱河市尖奔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穷当,老刑警劉巖提茁,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馁菜,居然都是意外死亡茴扁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門汪疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峭火,“玉大人毁习,你說我怎么就攤上這事÷敉瑁” “怎么了纺且?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稍浆。 經(jīng)常有香客問我载碌,道長,這世上最難降的妖魔是什么衅枫? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任嫁艇,我火速辦了婚禮,結(jié)果婚禮上弦撩,老公的妹妹穿的比我還像新娘步咪。我一直安慰自己,他們只是感情好益楼,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布猾漫。 她就那樣靜靜地躺著,像睡著了一般感凤。 火紅的嫁衣襯著肌膚如雪静袖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天俊扭,我揣著相機與錄音队橙,去河邊找鬼。 笑死萨惑,一個胖子當著我的面吹牛捐康,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庸蔼,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼解总,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姐仅?” 一聲冷哼從身側(cè)響起花枫,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掏膏,沒想到半個月后劳翰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡馒疹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年佳簸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颖变。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡生均,死狀恐怖听想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情马胧,我是刑警寧澤汉买,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站佩脊,受9級特大地震影響录别,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邻吞,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葫男。 院中可真熱鬧抱冷,春花似錦、人聲如沸梢褐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盈咳。三九已至耿眉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鱼响,已是汗流浹背鸣剪。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丈积,地道東北人筐骇。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像江滨,于是被迫代替她去往敵國和親铛纬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容