Reactor模型

想象以下情形:長途客車在路途上,有人上車有人下車魔吐,但是乘客總是希望能夠在客車上得到休息扎筒。
傳統(tǒng)的做法是:每隔一段時間(或每一個站),司機或售票員對每一個乘客詢問是否下車酬姆。
Reactor模式做法是:汽車是乘客訪問的主體(Reactor)嗜桌,乘客上車后,到售票員(acceptor)處登記辞色,之后乘客便可以休息睡覺去了骨宠,當(dāng)?shù)竭_乘客所要到達的目的地后,售票員將其喚醒即可淫僻。

概念

Reactor模式是基于事件驅(qū)動的分發(fā)處理模型
有一個或多個并發(fā)輸入源诱篷,有一個Service Handler,有多個Request Handlers
這個Service Handler會同步的將輸入的請求(Event)多路復(fù)用的分發(fā)給相應(yīng)的Request Handler雳灵。如果用圖來表達:

思想:分而治之+事件驅(qū)動

1)分而治之
一個連接里完整的網(wǎng)絡(luò)處理過程一般分為accept、read闸盔、decode悯辙、process、encode、send這幾步躲撰。
Reactor模式將每個步驟映射為一個Task针贬,服務(wù)端線程執(zhí)行的最小邏輯單元不再是一次完整的網(wǎng)絡(luò)請求,而是Task拢蛋,且采用非阻塞方式執(zhí)行桦他。

2)事件驅(qū)動
每個Task對應(yīng)特定網(wǎng)絡(luò)事件。當(dāng)Task準(zhǔn)備就緒時谆棱,Reactor收到對應(yīng)的網(wǎng)絡(luò)事件通知快压,并將Task分發(fā)給綁定了對應(yīng)網(wǎng)絡(luò)事件的Handler執(zhí)行。

3)幾個角色
reactor:負(fù)責(zé)綁定管理事件和處理接口垃瞧;
selector:負(fù)責(zé)監(jiān)聽響應(yīng)事件蔫劣,將事件分發(fā)給綁定了該事件的Handler處理;
Handler:事件處理器个从,綁定了某類事件脉幢,負(fù)責(zé)執(zhí)行對應(yīng)事件的Task對事件進行處理;
Acceptor:Handler的一種嗦锐,綁定了connect事件嫌松。當(dāng)客戶端發(fā)起connect請求時,Reactor會將accept事件分發(fā)給Acceptor處理奕污。

Reactor模式結(jié)構(gòu)

  • Handle 句柄萎羔;用來標(biāo)識socket連接或是打開文件;
  • Synchronous Event Demultiplexer:同步事件多路分解器:由操作系統(tǒng)內(nèi)核實現(xiàn)的一個函數(shù)菊值;用于阻塞等待發(fā)生在句柄集合上的一個或多個事件外驱;(如select/epoll;)
  • Event Handler:事件處理接口
  • Concrete Event HandlerA:實現(xiàn)應(yīng)用程序所提供的特定事件處理邏輯腻窒;
  • Reactor:反應(yīng)器昵宇,定義一個接口,實現(xiàn)以下功能:
    1)供應(yīng)用程序注冊和刪除關(guān)注的事件句柄儿子;
    2)運行事件循環(huán)瓦哎;
    3)有就緒事件到來時,分發(fā)事件到之前注冊的回調(diào)函數(shù)上處理柔逼;

“反應(yīng)”即“倒置”蒋譬,“控制逆轉(zhuǎn)”

流程

舉例

登錄——Accept新鏈接

新連接Read和Write過程

實現(xiàn)

單線程Reactor


1)優(yōu)點:
不需要做并發(fā)控制,代碼實現(xiàn)簡單清晰愉适。

2)缺點:

a)不能利用多核CPU犯助;
b)一個線程需要執(zhí)行處理所有的accept、read维咸、decode剂买、process惠爽、encode、send事件瞬哼,處理成百上千的鏈路時性能上無法支撐婚肆;
c)一旦reactor線程意外跑飛或者進入死循環(huán),會導(dǎo)致整個系統(tǒng)通信模塊不可用坐慰。

多線程Reactor

特點:

a)有專門一個reactor線程用于監(jiān)聽服務(wù)端ServerSocketChannel较性,接收客戶端的TCP連接請求;
b)網(wǎng)絡(luò)IO的讀/寫操作等由一個worker reactor線程池負(fù)責(zé)结胀,由線程池中的NIO線程負(fù)責(zé)監(jiān)聽SocketChannel事件赞咙,進行消息的讀取、解碼把跨、編碼和發(fā)送人弓。
c)一個NIO線程可以同時處理N條鏈路,但是一個鏈路只注冊在一個NIO線程上處理着逐,防止發(fā)生并發(fā)操作問題崔赌。

主從多線程


在絕大多數(shù)場景下,Reactor多線程模型都可以滿足性能需求耸别;但是在極個別特殊場景中健芭,一個NIO線程負(fù)責(zé)監(jiān)聽和處理所有的客戶端連接可能會存在性能問題。

特點:

a)服務(wù)端用于接收客戶端連接的不再是個1個單獨的reactor線程秀姐,而是一個boss reactor線程池慈迈;

b)服務(wù)端啟用多個ServerSocketChannel監(jiān)聽不同端口時,每個ServerSocketChannel的監(jiān)聽工作可以由線程池中的一個NIO線程完成省有。

Ref:
【原論文】http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf
http://www.voidcn.com/article/p-onnrusud-mz.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痒留,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蠢沿,更是在濱河造成了極大的恐慌伸头,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷蟀,死亡現(xiàn)場離奇詭異恤磷,居然都是意外死亡,警方通過查閱死者的電腦和手機野宜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門扫步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匈子,你說我怎么就攤上這事河胎。” “怎么了虎敦?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵仿粹,是天一觀的道長搁吓。 經(jīng)常有香客問我原茅,道長吭历,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任擂橘,我火速辦了婚禮晌区,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘通贞。我一直安慰自己朗若,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布昌罩。 她就那樣靜靜地躺著哭懈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茎用。 梳的紋絲不亂的頭發(fā)上遣总,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音轨功,去河邊找鬼旭斥。 笑死,一個胖子當(dāng)著我的面吹牛古涧,可吹牛的內(nèi)容都是我干的垂券。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼羡滑,長吁一口氣:“原來是場噩夢啊……” “哼菇爪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柒昏,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凳宙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昙楚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體近速,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年堪旧,在試婚紗的時候發(fā)現(xiàn)自己被綠了削葱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淳梦,死狀恐怖析砸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爆袍,我是刑警寧澤首繁,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布作郭,位于F島的核電站,受9級特大地震影響弦疮,放射性物質(zhì)發(fā)生泄漏夹攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一胁塞、第九天 我趴在偏房一處隱蔽的房頂上張望咏尝。 院中可真熱鬧,春花似錦啸罢、人聲如沸编检。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允懂。三九已至,卻和暖如春衩匣,著一層夾襖步出監(jiān)牢的瞬間蕾总,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工舵揭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谤专,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓午绳,卻偏偏與公主長得像置侍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拦焚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 一蜡坊、NIO Reactor模型 1、Reactor模式思想:分而治之+事件驅(qū)動 1)分而治之 一個連接里完整的網(wǎng)絡(luò)...
    益文的圈閱讀 23,179評論 14 165
  • 無處不在的C/S架構(gòu) 在這個充斥著云的時代,我們使用的軟件可以說99%都是C/S架構(gòu)的赎败! 你發(fā)郵件用的Outloo...
    IvanEye閱讀 13,814評論 7 59
  • 傳統(tǒng)的BIO模式 上面的代碼中秕衙,我們在主線程中處理客戶端的連接請求,然后為每個建立的連接分配一個線程去執(zhí)行僵刮。soc...
    德彪閱讀 915評論 0 0
  • 1.概述 在Reactor單線程版本的設(shè)計中据忘,I/O任務(wù)乃至業(yè)務(wù)邏輯都由Reactor線程來完成,這無疑增加了Re...
    topgunviper閱讀 4,929評論 0 7
  • Reactor模型是典型的事件驅(qū)動模型搞糕。在網(wǎng)絡(luò)編程中勇吊,所謂的事件當(dāng)然就是read、write窍仰、bind汉规、conne...
    topgunviper閱讀 4,014評論 0 9