自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Reactor模式及在DSS中的體現(xiàn)

開(kāi)發(fā) 后端
Reactor模式是處理并發(fā)I/O比較常見(jiàn)的一種模式,用于同步I/O,中心思想是將所有要處理的I/O事件注冊(cè)到一個(gè)中心I/O多路復(fù)用器上,同時(shí)主線程阻塞在多路復(fù)用器上;一旦有I/O事件到來(lái)或是準(zhǔn)備就緒(區(qū)別在于多路復(fù)用器是邊沿觸發(fā)還是水平觸發(fā)),多路復(fù)用器返回并將相應(yīng)I/O事件分發(fā)到對(duì)應(yīng)的處理器中。

Reactor模式是處理并發(fā)I/O比較常見(jiàn)的一種模式,用于同步I/O,中心思想是將所有要處理的I/O事件注冊(cè)到一個(gè)中心I/O多路復(fù)用器上,同時(shí)主線程阻塞在多路復(fù)用器上;一旦有I/O事件到來(lái)或是準(zhǔn)備就緒(區(qū)別在于多路復(fù)用器是邊沿觸發(fā)還是水平觸發(fā)),多路復(fù)用器返回并將相應(yīng)I/O事件分發(fā)到對(duì)應(yīng)的處理器中。

Reactor是一種事件驅(qū)動(dòng)機(jī)制,和普通函數(shù)調(diào)用的不同之處在于:應(yīng)用程序不是主動(dòng)的調(diào)用某個(gè)API完成處理,而是恰恰相反,Reactor逆置了事件處理流程,應(yīng)用程序需要提供相應(yīng)的接口并注冊(cè)到Reactor上,如果相應(yīng)的事件發(fā)生,Reactor將主動(dòng)調(diào)用應(yīng)用程序注冊(cè)的接口,這些接口又稱(chēng)為“回調(diào)函數(shù)”。用“好萊塢原則”來(lái)形容Reactor再合適不過(guò)了:不要打電話給我們,我們會(huì)打電話通知你。

Reactor模式與Observer模式在某些方面極為相似:當(dāng)一個(gè)主體發(fā)生改變時(shí),所有依屬體都得到通知。不過(guò),觀察者模式與單個(gè)事件源關(guān)聯(lián),而反應(yīng)器模式則與多個(gè)事件源關(guān)聯(lián) 。 

模式框架

 

1) Handle 

Handle代表操作系統(tǒng)管理的資源,包括:網(wǎng)絡(luò)鏈接,打開(kāi)的文件,計(jì)時(shí)器,同步對(duì)象等等。Linux上是文件描述符,Windows上就是Socket或者Handle了,這里統(tǒng)一稱(chēng)為“句柄集”;程序在指定的句柄上注冊(cè)關(guān)心的事件,比如I/O事件。 

2) Event Demultiplexer 

事件分離器,由操作系統(tǒng)提供,在linux上一般是select, poll, epoll等系統(tǒng)調(diào)用,在一個(gè)Handle集合上等待事件的發(fā)生。接受client連接,建立對(duì)應(yīng)client的事件處理器(Event Handler),并向事件分發(fā)器(Reactor)注冊(cè)此事件處理器(Handler)。 

3) Reactor(Initiation Dispatcher) 

提供接口:注冊(cè),刪除和派發(fā)Event Handler。Event Demultiplexer等待事件的發(fā)生,當(dāng)檢測(cè)到新的事件,就把事件交給Initiation Dispatcher,它去回調(diào)Event Handler。 

4) Event Handler 

事件處理器,負(fù)責(zé)處理特定事件的處理函數(shù)。一般在基本的Handler基礎(chǔ)上還會(huì)有更進(jìn)一步的層次劃分,用來(lái)抽象諸如decode,process和encoder這些過(guò)程。比如對(duì)Web Server而言,decode通常是HTTP請(qǐng)求的解析,process的過(guò)程會(huì)進(jìn)一步涉及到Listner和Servlet的調(diào)用。為了簡(jiǎn)化設(shè)計(jì),Event Handler通常被設(shè)計(jì)成狀態(tài)機(jī),按GoF的state pattern來(lái)實(shí)現(xiàn)。 

5) Concrete Event Handler 

繼承上面的類(lèi),實(shí)現(xiàn)鉤子方法。應(yīng)用把Concrete Event Handler注冊(cè)到Reactor,等待被處理的事件。當(dāng)事件發(fā)生,這些方法被回調(diào)。 

事件處理流程

模式模型

應(yīng)用場(chǎng)景舉例

場(chǎng)景:長(zhǎng)途客車(chē)在路途上,有人上車(chē)有人下車(chē),但是乘客總是希望能夠在客車(chē)上得到休息。

傳統(tǒng)做法:每隔一段時(shí)間(或每一個(gè)站),司機(jī)或售票員對(duì)每一個(gè)乘客詢(xún)問(wèn)是否下車(chē)。

Reactor做法:汽車(chē)是乘客訪問(wèn)的主體(Reactor),乘客上車(chē)后,到售票員(acceptor)處登記,之后乘客便可以休息睡覺(jué)去了,當(dāng)?shù)竭_(dá)乘客所要到達(dá)的目的地后,售票員將其喚醒即可。

1) 單線程模型

這是最簡(jiǎn)單的單Reactor單線程模型。Reactor線程是個(gè)多面手,負(fù)責(zé)多路分離套接字,Accept新連接,并分派請(qǐng)求到處理器鏈中。該模型適用于處理器鏈中業(yè)務(wù)處理組件能快速完成的場(chǎng)景。不過(guò)這種單線程模型不能充分利用多核資源,所以實(shí)際使用的不多。 

2) 多線程模型(單Reactor) 

相比上一種模型,該模型在事件處理器(Handler)鏈部分采用了多線程(線程池),也是后端程序常用的模型。 

 

3) 多線程模型(多Reactor) 

這個(gè)模型比起第二種模型,它是將Reactor分成兩部分,mainReactor負(fù)責(zé)監(jiān)聽(tīng)并accept新連接,然后將建立的socket通過(guò)多路復(fù)用器(Acceptor)分派給subReactor。subReactor負(fù)責(zé)多路分離已連接的socket,讀寫(xiě)網(wǎng)絡(luò)數(shù)據(jù);業(yè)務(wù)處理功能,其交給worker線程池完成。通常,subReactor個(gè)數(shù)上可與CPU個(gè)數(shù)等同。

  

優(yōu)缺點(diǎn) 

優(yōu)點(diǎn) 

  • 響應(yīng)快,不必為單個(gè)同步時(shí)間所阻塞,雖然Reactor本身依然是同步的;

  • 編程相對(duì)簡(jiǎn)單,可以最大程度的避免復(fù)雜的多線程及同步問(wèn)題,并且避免了多線程/進(jìn)程的切換開(kāi)銷(xiāo);

  • 可擴(kuò)展性,可以方便的通過(guò)增加Reactor實(shí)例個(gè)數(shù)來(lái)充分利用CPU資源;

  • 可復(fù)用性,Reactor框架本身與具體事件處理邏輯無(wú)關(guān),具有很高的復(fù)用性; 

缺點(diǎn) 

  • 應(yīng)用受限制:Reactor模式只能應(yīng)用在支持Handle的操作系統(tǒng)上。雖然可以使用多線程模擬Reactor,但因?yàn)橥娇刂坪蜕舷挛那袚Q的要求,這種實(shí)現(xiàn)效率低,與Reactor模式出發(fā)點(diǎn)相違背。

  • 非搶占模式:在單線程的實(shí)現(xiàn)這種情況下,事件的處理必須不能使用阻塞的I/O,因此,如果存在長(zhǎng)期操作,比如傳輸大量的數(shù)據(jù)。使用主動(dòng)對(duì)象,效率可能更好,主動(dòng)對(duì)象可以并發(fā)的處理這些任務(wù)。

  • 難以調(diào)試:使用Reactor模式的應(yīng)用程序可能會(huì)難以調(diào)試,因?yàn)槌绦蜻\(yùn)行的控制流會(huì)在框架和應(yīng)用相關(guān)的處理器之間跳轉(zhuǎn),不了解框架的應(yīng)用程序開(kāi)發(fā)人員難一跟著調(diào)試。 

相關(guān)庫(kù) 

ACE 

ACE是一個(gè)大型的中間件產(chǎn)品,代碼20萬(wàn)行左右,過(guò)于宏大,一堆的設(shè)計(jì)模式,架構(gòu)了一層又一層,使用的時(shí)候,要根據(jù)情況,看從那一層來(lái)進(jìn)行使用。支持跨平臺(tái)。 

設(shè)計(jì)模式 :ACE主要應(yīng)用了Reactor,Proactor等; 

層次架構(gòu) :ACE底層是C風(fēng)格的OS適配層,上一層基于C++的wrap類(lèi),再上一層是一些框架 (Accpetor,Connector,Reactor,Proactor等),最上一層是框架上服務(wù); 

可移植性 :ACE支持多種平臺(tái),可移植性不存在問(wèn)題,據(jù)說(shuō)socket編程在linux下有不少bugs; 

事件分派處理 :ACE主要是注冊(cè)handler類(lèi),當(dāng)事件分派時(shí),調(diào)用其handler的虛掛勾函數(shù)。實(shí)現(xiàn) ACE_Handler/ACE_Svc_Handler/ACE_Event_handler等類(lèi)的虛函數(shù); 

涉及范圍 :ACE包含了日志,IPC,線程池,共享內(nèi)存,配置服務(wù),遞歸鎖,定時(shí)器等; 

線程調(diào)度 :ACE的Reactor是單線程調(diào)度,Proactor支持多線程調(diào)度; 

發(fā)布方式 :ACE是開(kāi)源免費(fèi)的,不依賴(lài)于第三方庫(kù),一般應(yīng)用使用它時(shí),以動(dòng)態(tài)鏈接的方式發(fā)布動(dòng)態(tài)庫(kù);開(kāi)發(fā)難度 :基于ACE開(kāi)發(fā)應(yīng)用,對(duì)程序員要求比較高,要用好它,必須非常了解其框架。在其框架下開(kāi)發(fā),往往new出一個(gè)對(duì)象,不知在什么地方釋放好。 

Libevent 

libevent是一個(gè)C語(yǔ)言寫(xiě)的網(wǎng)絡(luò)庫(kù),官方主要支持的是類(lèi)linux操作系統(tǒng),最新的版本添加了對(duì)windows的IOCP的支持。在跨平臺(tái)方面主要通過(guò)select模型來(lái)進(jìn)行支持。 

設(shè)計(jì)模式 :libevent為Reactor模式; 

層次架構(gòu):livevent在不同的操作系統(tǒng)下,做了多路復(fù)用模型的抽象,可以選擇使用不同的模型,通過(guò)事件函數(shù)提供服務(wù); 

可移植性 :libevent主要支持linux平臺(tái),freebsd平臺(tái),其他平臺(tái)下通過(guò)select模型進(jìn)行支持,效率不是太高; 

事件分派處理 :libevent基于注冊(cè)的事件回調(diào)函數(shù)來(lái)實(shí)現(xiàn)事件分發(fā);

涉及范圍 :libevent只提供了簡(jiǎn)單的網(wǎng)絡(luò)API的封裝,線程池,內(nèi)存池,遞歸鎖等均需要自己實(shí)現(xiàn);

線程調(diào)度 :libevent的線程調(diào)度需要自己來(lái)注冊(cè)不同的事件句柄;

發(fā)布方式 :libevent為開(kāi)源免費(fèi)的,一般編譯為靜態(tài)庫(kù)進(jìn)行使用;

開(kāi)發(fā)難度 :基于libevent開(kāi)發(fā)應(yīng)用,相對(duì)容易,具體可以參考memcached這個(gè)開(kāi)源的應(yīng)用,里面使用了 libevent這個(gè)庫(kù)。 

Libev

與 libevent 一樣,libev 系統(tǒng)也是基于事件循環(huán)的系統(tǒng),它在 poll()、select() 等機(jī)制的本機(jī)實(shí)現(xiàn)的基礎(chǔ)上提供基于事件的循環(huán)。libev 實(shí)現(xiàn)的開(kāi)銷(xiāo)更低,能夠?qū)崿F(xiàn)更好的基準(zhǔn)測(cè)試結(jié)果。 

Reactor模式在DSS中的體現(xiàn)

Darwin流媒體服務(wù)器是由父進(jìn)程及其fork出來(lái)的子進(jìn)程構(gòu)成的,子進(jìn)程就是核心服務(wù)器。父進(jìn)程的職責(zé)就是等待子進(jìn)程退出。如果子進(jìn)程出錯(cuò)退出,則父進(jìn)程就會(huì)fork一個(gè)新的子進(jìn)程,從而保證視頻服務(wù)器繼續(xù)提供服務(wù)。核心服務(wù)器的作用是充當(dāng)VOD(視頻點(diǎn)播)客戶(hù)端與服務(wù)器模塊之間的接口,VOD客戶(hù)端采用RTP和RTSP協(xié)議向服務(wù)器發(fā)送請(qǐng)求并接收響應(yīng),服務(wù)器模塊負(fù)責(zé)處理VOD客戶(hù)端的請(qǐng)求并向VOD客戶(hù)端發(fā)送數(shù)據(jù)包。

在DSS中,除主線程以外,還有有三種類(lèi)型的線程:

  • TaskThread:TaskThread通過(guò)運(yùn)行Task類(lèi)型對(duì)象的Run方法來(lái)完成相應(yīng)Task的處理。典型的Task類(lèi)型是RTSPSession和RTPSession。TaskThread的個(gè)數(shù)是可配置的,缺省情況下TaskThread的個(gè)數(shù)與處理器的個(gè)數(shù)一致。等待被TaskThread調(diào)用并運(yùn)行的Task放在隊(duì)列或者堆中。

  • EventThread:EventThread負(fù)責(zé)偵聽(tīng)套接口事件,在DSS中,有兩種被偵聽(tīng)的事件,分別是建立RTSP連接請(qǐng)求的到達(dá)和RTSP請(qǐng)求的到達(dá)。對(duì)于RTSP連接請(qǐng)求的事件,EventThread建立一個(gè)RTSP
    Session,并啟動(dòng)針對(duì)相應(yīng)的socket的偵聽(tīng)。對(duì)于RTSP請(qǐng)求的事件,EventThread把對(duì)應(yīng)的RTSPSession類(lèi)型的Task加入到TaskThread的隊(duì)列中,等待RTSP請(qǐng)求被處理。

  • IdleTaskThread:IdleTaskThread管理IdleTask類(lèi)型對(duì)象的隊(duì)列,根據(jù)預(yù)先設(shè)定的定時(shí)器觸發(fā)IdleTask的調(diào)度。TCPListenerSocket就是一個(gè)IdleTask的派生類(lèi),當(dāng)并發(fā)連接數(shù)達(dá)到設(shè)定的最大值時(shí),會(huì)把派生自TCPListenerSocket的RTSPListenerSocket加入到IdleTaskThread管理的IdleTask隊(duì)列中,暫時(shí)停止對(duì)RTSP端口的偵聽(tīng),直到被設(shè)定好的定時(shí)器觸發(fā)。

下圖是Darwin Streaming Server核心架構(gòu)的示意圖。在這個(gè)示意圖中有三種類(lèi)型的要素,分別是線程,Task隊(duì)列或者堆,被偵聽(tīng)的事件。 

其中,事件線程(Event thread)是Event Demultiplexer(事件分離器),任務(wù)線程(Task threads)是Event Handler(事件處理器)。

 

這里的主線程(Main thread)就是Reactor模式中的Reactor(Initiation Dispatcher)。

E-Mail : Mike_Zhang@live.com

原文鏈接:http://www.cnblogs.com/MikeZhang/archive/2012/08/16/ReactorPattern20120815.html

責(zé)任編輯:林師授 來(lái)源: 博客園
相關(guān)推薦

2018-10-11 10:38:31

前端JavaScript編程語(yǔ)言

2009-12-29 14:58:31

WPF優(yōu)點(diǎn)

2021-07-10 08:04:07

Reactor模式Netty

2011-06-19 08:59:59

錨文本

2009-12-29 14:00:02

WPF Dispatc

2009-12-04 17:31:32

PHP編碼轉(zhuǎn)換

2011-12-08 10:51:25

JavaNIO

2010-01-08 18:02:33

VB.NET事件

2010-03-03 17:52:31

Python線程同步

2010-07-06 09:12:16

UML圖關(guān)系

2010-05-05 16:17:27

Oracle安全策略

2017-08-24 09:35:06

深度學(xué)習(xí)向量化Hash Trick

2010-03-04 10:35:51

Python下劃線

2010-02-25 17:22:39

WCF服務(wù)行為

2009-12-24 17:52:05

WPF觸發(fā)器

2010-02-02 13:15:00

C++ lambda函

2022-03-04 08:10:35

NettyIO模型Reactor

2010-01-14 10:35:34

VB.NET指針

2022-10-25 08:23:09

Reactor模式I/O

2010-01-20 18:34:46

VB.NET Syst
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)