高性能服務(wù)器線程模型演進 Tomcat Netty Vert.x

Hello World

  • 讓我們從最簡單的單線程阻塞模型開始
ServerSocket server = new ServerSocket(8080);
    
Socket socket = server.accept();

InputStream inputStream = socket.getInputStream();

byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
    sb.append(new String(bytes, 0, len,"UTF-8"));
}

System.out.println("get message from client: " + sb);

OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello World".getBytes("UTF-8"));


outputStream.close();
inputStream.close();
socket.close();
server.close();
  • 這個初始版本只能單線程處理悬包,其中的IO會堵塞,性能很差


    單線程.jpg

tomcat

  • tomcat是我們比較熟悉的傳統(tǒng)web容器紊扬。提供了多線程的線程模型和NIO多路復(fù)用
    • 用一個Acceptor線程統(tǒng)一處理連接
    • 連上后交給Poller處理底層協(xié)議和一般性的IO亥揖,Poller線程數(shù)為CPU個數(shù)
    • Poller線程處理完底層的協(xié)議之后把servlet相關(guān)的請求交給worker處理烛亦, worker線程數(shù)默認是200個
tomcat2.jpg
  • 但是tomcat的異步處理只是占一部分, 并不徹底
    tomcat io 對比
    tomcat_io.jpg
  • 另外servlet模型本身對異步的支持到3.1才開始坝咐。按照我的理解servlet3.1本質(zhì)上是提供了脫離tomcat線程的回調(diào)語法。[這篇文件寫得極好](https://www.cnblogs.com/mianteno/p/10780257.html

netty

  • netty提供了更高效率的線程模型撒桨。當(dāng)然他也使用了DirectBuffer, JCTools的高性能無鎖隊列查刻。這里只介紹線程模型:
netty.jpg
  • EventLoop類似于tomcat中的Poller,主要處理連接之外的全部IO凤类。線程數(shù)是CPU*2
  • 另外Eventloop也會處理協(xié)議和業(yè)務(wù)回調(diào)赖阻。參考源碼:NIOEventLoop#run
        final long ioStartTime = System.nanoTime();
        try {
               processSelectedKeys(); // 處理IO
        } finally {
               // Ensure we always run tasks.
               final long ioTime = System.nanoTime() - ioStartTime;
               // 用相同的時間處理回調(diào)業(yè)務(wù)
               ranTasks = runAllTasks(ioTime * (100 - ioRatio) / ioRatio);                         
        }
  • IO處理和任務(wù)處理的默認比例是1:1
  • Netty這樣做有幾個好處
    • 使用較少的線程意味著減少上下文切換
    • 使用較少內(nèi)存,java每個線程棧默認1M開銷
    • 一個EventLoop綁定多個Channel和對應(yīng)的業(yè)務(wù)處理踱蠢。從channel的角度看是單線程的,不存在線程切換棋电,不需要處理并發(fā)問題茎截。
  • 當(dāng)然Netty的線程處理有個大前提。不能block Eventloop!!!
  • 但是傳統(tǒng)的業(yè)務(wù)處理都是阻塞型的赶盔,必須開另外的線程池處理企锌,這就和tomcat比優(yōu)勢不明顯了

vert.x

  • vert.x是對netty的高級別封裝,其核心還是EventLoop
  • 他通過全異步的方式使得IO全異步處理而通過少量線程性能最大化
vertx.jpg
  • 這個例子里通過Vert.x的EventLoop接管http/redis的IO和回調(diào)
  • 理論上所有的代碼都可以異步于未,vert.x提供了大量的常用框架的異步IO適配撕攒。
  • 對于不能或不方便的阻塞代碼, 通過worker線程池處理陡鹃,幷提供異步回調(diào)接口(例子中的mysql調(diào)用)

為什么netty/nginx之類的高性能服務(wù)器不用AIO呢?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖坪,一起剝皮案震驚了整個濱河市萍鲸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擦俐,老刑警劉巖脊阴,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚯瞧,居然都是意外死亡嘿期,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門埋合,熙熙樓的掌柜王于貴愁眉苦臉地迎上來备徐,“玉大人,你說我怎么就攤上這事甚颂∶刍” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵西设,是天一觀的道長瓣铣。 經(jīng)常有香客問我,道長贷揽,這世上最難降的妖魔是什么棠笑? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮禽绪,結(jié)果婚禮上蓖救,老公的妹妹穿的比我還像新娘。我一直安慰自己印屁,他們只是感情好循捺,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雄人,像睡著了一般从橘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上础钠,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天恰力,我揣著相機與錄音,去河邊找鬼旗吁。 笑死踩萎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的很钓。 我是一名探鬼主播香府,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼董栽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了企孩?” 一聲冷哼從身側(cè)響起锭碳,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柠硕,沒想到半個月后工禾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蝗柔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年闻葵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癣丧。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡槽畔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胁编,到底是詐尸還是另有隱情厢钧,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布嬉橙,位于F島的核電站早直,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏市框。R本人自食惡果不足惜霞扬,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枫振。 院中可真熱鬧喻圃,春花似錦、人聲如沸粪滤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖小。三九已至肆汹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間予权,已是汗流浹背昂勉。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伟件,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓议经,卻偏偏與公主長得像斧账,于是被迫代替她去往敵國和親谴返。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353