Vert.x架構(gòu)學(xué)習(xí)之Reactor模式

前言

學(xué)習(xí)Vert.x之前抢蚀,我們首先需要了解一下幾個(gè)概念医舆,Reactor設(shè)計(jì)模式就是其中一個(gè)炕柔。

一脑蠕、Reactor模式簡(jiǎn)介

? ? ? 我們知道對(duì)于應(yīng)用服務(wù)器购撼,通常會(huì)涉及到對(duì)文件系統(tǒng)、數(shù)據(jù)庫(kù)系統(tǒng)或者網(wǎng)絡(luò)進(jìn)行IO操作谴仙,由于cpu的運(yùn)行速度遠(yuǎn)大于IO的速度迂求,所以會(huì)發(fā)生這種情況:CPU可能會(huì)因?yàn)镮O的操作而阻塞。我們當(dāng)然不希望這種情況的發(fā)生晃跺,因?yàn)檫@大大降低了CPU的效率揩局,因此,引進(jìn)了多現(xiàn)程或多進(jìn)程進(jìn)行處理掀虎,即多個(gè)線(xiàn)程綁定多個(gè)IO事件凌盯,這樣雖然可以提高CPU的效率付枫,但仍然存在進(jìn)程切換帶來(lái)的弊端。

? ? ? ? 于是便引入了Reactor模式驰怎,首先励背,它是基于事件驅(qū)動(dòng),應(yīng)用服務(wù)首先向一個(gè)中間人注冊(cè)一個(gè)回調(diào)(event handler)進(jìn)行注冊(cè)砸西,然后中間人輪詢(xún)?cè)谄渖献?cè)過(guò)的服務(wù)叶眉,當(dāng)有IO就緒時(shí),中間人產(chǎn)生一個(gè)事件芹枷,并通知綁定的handler進(jìn)行處理衅疙,這種回調(diào)體現(xiàn)了"好萊塢原則"("Don’t call us, we’ll call you"),在IOC(控制反轉(zhuǎn))原則中也有相似的體現(xiàn)。這個(gè)中間人就是Reactor鸳慈。

? ? ? ? 通俗的來(lái)說(shuō)饱溢,在Reactor模式中,應(yīng)用程序不是主動(dòng)的調(diào)用某個(gè)API完成處理走芋,而是逆置了事件處理流程绩郎,應(yīng)用程序需要提供相應(yīng)的事件接口并注冊(cè)到Reactor上,如果相應(yīng)的事件發(fā)生翁逞,Reactor將主動(dòng)調(diào)用應(yīng)用程序注冊(cè)的接口肋杖,通過(guò)注冊(cè)的接口完成具體的事件處理。

二挖函、.模式組成及處理流程

1状植、模式組成

Reactor模式由事件源、事件反應(yīng)器怨喘、事件分離器津畸、事件處理器等組件組成。

事件源(handle):由操作系統(tǒng)提供必怜,用于識(shí)別每一個(gè)事件肉拓,如Socket描述符、文件描述符等梳庆。在服務(wù)端系統(tǒng)中用一個(gè)整數(shù)表示暖途。該事件可能來(lái)自外部,如來(lái)自客戶(hù)端的連接請(qǐng)求靠益、數(shù)據(jù)等丧肴。也可能來(lái)自?xún)?nèi)部,如定時(shí)器事件胧后。

事件反應(yīng)器(reactor):定義和應(yīng)用程序控制事件調(diào)度芋浮,以及應(yīng)用程序注冊(cè)、刪除事件處理器和相關(guān)描述符相關(guān)的接口。它是事件處理器的調(diào)度核心纸巷,使用事件分離器來(lái)等待事件的發(fā)生镇草。一旦事件發(fā)生,反應(yīng)器先是分離每個(gè)事件瘤旨,然后調(diào)度具體事件的事件處理器中的回調(diào)函數(shù)處理事件梯啤。

事件分離器(demultiplexer):是一個(gè)有操作系統(tǒng)提供的I/O復(fù)用函數(shù),在此我們選用epoll存哲。用來(lái)等待一個(gè)或多個(gè)事件的發(fā)生因宇。調(diào)用者將會(huì)被阻塞,直到分離器分離的描述符集上有事件發(fā)生祟偷。

事件處理器(even handler):事件處理程序提供了一組接口察滑,每個(gè)接口對(duì)應(yīng)了一種類(lèi)型的事件,供reactor在相應(yīng)的事件發(fā)生時(shí)調(diào)用修肠,執(zhí)行相應(yīng)的事件處理贺辰。一般每個(gè)具體的事件處理器總是會(huì)綁定一個(gè)有效的描述符句柄,用來(lái)識(shí)別事件和服務(wù)嵌施。

2饲化、處理流程

處理流程主要分為兩個(gè)部分,事件注冊(cè)部分和事件分發(fā)部分 吗伤;

下面具體看一下Reactor結(jié)構(gòu)圖


? ? ? 在事件注冊(cè)部分吃靠,應(yīng)用程序首先將期待注冊(cè)的套接字描述符作為事件源,并將描述符和該事件對(duì)應(yīng)的事件處理回調(diào)函數(shù)封裝到具體的事件處理器中牲芋,并將該事件處理器注冊(cè)到事件反應(yīng)器(Initialization Dispatcher)中撩笆。事件反應(yīng)器接收到事件后捺球,進(jìn)行相應(yīng)處理缸浦,并將注冊(cè)信息再次注冊(cè)到事件分離器epoll中。最后在epoll分離器中氮兵,通過(guò)epoll_ctl進(jìn)行添加描述符及其事件裂逐,并層層返回注冊(cè)結(jié)果。

? ? ? ?在事件處理部分泣栈,首先事件反應(yīng)器通過(guò)調(diào)用事件分離器的epoll_wait卜高,使線(xiàn)程阻塞等待注冊(cè)事件發(fā)生。此時(shí)如果某注冊(cè)事件發(fā)生南片,epoll_wait將會(huì)返回掺涛,并將包含該注冊(cè)事件在內(nèi)的事件集返回給事件反應(yīng)器。反應(yīng)器接收到該事件后疼进,根據(jù)該事件源找到該事件的事件處理器薪缆,并判斷事件類(lèi)型,根據(jù)事件類(lèi)型在該事件處理器調(diào)用之前注冊(cè)時(shí)封裝的具體回調(diào)函數(shù)伞广,在這個(gè)具體回調(diào)函數(shù)中完成事件處理拣帽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疼电,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子减拭,更是在濱河造成了極大的恐慌蔽豺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧粪,死亡現(xiàn)場(chǎng)離奇詭異修陡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)可霎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)濒析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人啥纸,你說(shuō)我怎么就攤上這事号杏。” “怎么了斯棒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵盾致,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荣暮,道長(zhǎng)庭惜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任穗酥,我火速辦了婚禮护赊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砾跃。我一直安慰自己骏啰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布抽高。 她就那樣靜靜地躺著判耕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翘骂。 梳的紋絲不亂的頭發(fā)上壁熄,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音碳竟,去河邊找鬼草丧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛莹桅,可吹牛的內(nèi)容都是我干的昌执。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仙蚜!你這毒婦竟也來(lái)了此洲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤委粉,失蹤者是張志新(化名)和其女友劉穎呜师,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贾节,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汁汗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栗涂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片知牌。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斤程,靈堂內(nèi)的尸體忽然破棺而出角寸,到底是詐尸還是另有隱情,我是刑警寧澤忿墅,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布扁藕,位于F島的核電站,受9級(jí)特大地震影響疚脐,放射性物質(zhì)發(fā)生泄漏亿柑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一棍弄、第九天 我趴在偏房一處隱蔽的房頂上張望望薄。 院中可真熱鬧,春花似錦呼畸、人聲如沸痕支。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)采转。三九已至,卻和暖如春瞬痘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背板熊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工框全, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人干签。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓津辩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喘沿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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