【原創(chuàng)】NioEventLoop 的職責(zé)

作者:星巴刻

在 Netty NIO 編程中州叠,NioEventLoop 是一個(gè)核心類后众,發(fā)揮著極其重要的作用,要深入 Netty 的核心祟昭,必須深刻地對(duì)這個(gè)類進(jìn)行探究和理解缕坎。

服務(wù)端

在服務(wù)端程序中有兩類 NioEventLoop。一類稱為 parent (也稱 boss)篡悟,這一類 NioEventLoop 一般也就只有一個(gè)谜叹,專門負(fù)責(zé)發(fā)現(xiàn)客戶端連接。另一類是 child (也稱 worker)搬葬,這一類 NioEventLoop 要設(shè)置有限的若干個(gè)荷腊,默認(rèn)的個(gè)數(shù)只是為 CPU 核數(shù)的 2 倍,它負(fù)責(zé)處理客戶端連接的信息讀寫(xiě)急凰。使用 NIO 模式的服務(wù)端程序女仰,child 的個(gè)數(shù)可遠(yuǎn)遠(yuǎn)小于客戶端連接數(shù)。作為 parent 或者 child 的 NioEventLoop 都可以注冊(cè)不限制一個(gè)的 Channel 實(shí)例進(jìn)行服務(wù)抡锈。

parent 要負(fù)責(zé)的是表示服務(wù)端偵聽(tīng)端口的 NioServerSocketChannel 實(shí)例疾忍,NioServerSocketChannel 實(shí)例只有一個(gè)。把這個(gè) NioServerSocketChannel 注冊(cè)到 parent 后床三,parent 就開(kāi)始負(fù)責(zé)發(fā)現(xiàn)該 NioServerSocketChannel 上新的客戶端連接一罩,觸發(fā)對(duì)新來(lái)的客戶端連接進(jìn)行初始化工作,引導(dǎo)到后續(xù)的信息讀寫(xiě)等處理程序撇簿。

child 要負(fù)責(zé)的是表示客戶端連接的 NioSocketChannel 實(shí)例擒抛。NioSocketChannel 實(shí)例和客戶端連接數(shù)一一對(duì)應(yīng),因此程序中同時(shí)會(huì)有很多 NioSocketChannel 實(shí)例补疑。由于 child 數(shù)量有限(8 核 CPU 下默認(rèn)是 16 個(gè) child)歧沪,因此一個(gè) child 要同時(shí)負(fù)責(zé)多個(gè) NioSocketChannel,發(fā)現(xiàn)這些連接的可讀可寫(xiě)事件莲组,觸發(fā)應(yīng)用程序從系統(tǒng)緩沖區(qū)讀取字節(jié)流诊胞、對(duì)消息進(jìn)行編解碼、調(diào)用邏輯程序處理、繼續(xù)對(duì)先前中斷的系統(tǒng)緩沖區(qū)的寫(xiě)入等撵孤。

最簡(jiǎn)單地說(shuō)迈着,NioEventLoop 的首要職責(zé)就是為注冊(cè)在它上的 channels 服務(wù),發(fā)現(xiàn)這些 channels 上發(fā)生的新連接事件邪码、讀寫(xiě)等 I/O 事件裕菠,然后將事件轉(zhuǎn)交 channel 流水線處理。

下表是一個(gè)服務(wù)端程序的一個(gè)簡(jiǎn)單快照闭专。每一行代表一個(gè) NioEventLoop奴潘,第一行是 parent,負(fù)責(zé)處理NioServerSocketChannel影钉。隨后是16行的 child画髓,每一個(gè) child 負(fù)責(zé)多個(gè)NioSocketChannel。

表1:一個(gè)服務(wù)端程序的 NioEventLoop及其負(fù)責(zé)的 channels

隨著程序的進(jìn)行平委,表格的行數(shù)并不會(huì)變化奈虾,但是每行的 channels 會(huì)隨著連接的建立和斷開(kāi)不斷地變化著。Netty 并不保證每個(gè) NioEventLoop 負(fù)責(zé)的 channels 個(gè)數(shù)要進(jìn)行均衡廉赔, Netty 對(duì)新建立的連接采用簡(jiǎn)單的尋找下一個(gè) NioEventLoop 的策略肉微,并且在連接斷開(kāi)后也不會(huì)進(jìn)行重新分布;或許某些極端情況下蜡塌,可能出現(xiàn)某些 NioEventLoop 負(fù)責(zé)的 channels 比其他 NioEventLoop 負(fù)責(zé)的要多很多浪册,但這似乎不是問(wèn)題。

說(shuō)完服務(wù)端說(shuō)客戶端

客戶端比服務(wù)端簡(jiǎn)單岗照,客戶端程序只有一類? NioEventLoop村象,直接就是 parent ,沒(méi)有 child攒至。一般地厚者,由于客戶端和服務(wù)端只保留一個(gè)連接,所以只有一個(gè) channel迫吐,即一個(gè) parent 只負(fù)責(zé) NioEventChannel 的 I/O 事件库菲。但對(duì)于需要同一個(gè)服務(wù)端保持多個(gè)連接的,或者需要和多個(gè)服務(wù)端保持連接的志膀,則程序里依然會(huì)存在多個(gè) NioEventChannel 實(shí)例熙宇,但在實(shí)踐上還是建議這些不同的的連接使用同一個(gè) NioEventLoop,即都統(tǒng)一歸到 parent 負(fù)責(zé):

表2:客戶端程序的 NioEventLoop 只有一個(gè)溉浙,負(fù)責(zé)多個(gè) NioSocketChannel

下一個(gè)問(wèn)題:NioEventLoop 是怎么發(fā)現(xiàn)其所負(fù)責(zé)的 channels 發(fā)生了 I/O 事件烫止?

2017-11-18


本文地址:http://www.reibang.com/p/064a188b1803

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市戳稽,隨后出現(xiàn)的幾起案子馆蠕,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件互躬,死亡現(xiàn)場(chǎng)離奇詭異播赁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吼渡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門容为,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寺酪,你說(shuō)我怎么就攤上這事坎背。” “怎么了房维?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抬纸。 經(jīng)常有香客問(wèn)我咙俩,道長(zhǎng),這世上最難降的妖魔是什么湿故? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任阿趁,我火速辦了婚禮,結(jié)果婚禮上坛猪,老公的妹妹穿的比我還像新娘脖阵。我一直安慰自己,他們只是感情好墅茉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布命黔。 她就那樣靜靜地躺著,像睡著了一般就斤。 火紅的嫁衣襯著肌膚如雪悍募。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天洋机,我揣著相機(jī)與錄音坠宴,去河邊找鬼。 笑死绷旗,一個(gè)胖子當(dāng)著我的面吹牛喜鼓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衔肢,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庄岖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了角骤?” 一聲冷哼從身側(cè)響起顿锰,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后硼控,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刘陶,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年牢撼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匙隔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熏版,死狀恐怖纷责,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撼短,我是刑警寧澤再膳,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站曲横,受9級(jí)特大地震影響喂柒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禾嫉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一灾杰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熙参,春花似錦艳吠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至黍匾,卻和暖如春题禀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膀捷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工迈嘹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人全庸。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓秀仲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壶笼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子神僵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)覆劈,斷路器保礼,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 作者:星巴刻 前文《 NioEventLoop 的職責(zé)》從外部的角度闡述了 NioEventLoop 的首要責(zé)任:...
    星巴刻閱讀 1,367評(píng)論 1 4
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 作者:星巴刻 一沛励、Netty 內(nèi)核組 Netty 運(yùn)行時(shí)包含了多個(gè)內(nèi)核。在服務(wù)端程序中炮障,需要分別創(chuàng)...
    星巴刻閱讀 1,255評(píng)論 1 5
  • 本文是Netty文集中“Netty in action”系列的文章目派。主要是對(duì)Norman Maurer and M...
    tomas家的小撥浪鼓閱讀 1,454評(píng)論 0 5