Reactor构架模式--转载
原文:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310468a3b404380143c86964868d4e419ce3b46414565e3b92d3f130ed8c46b6776f50f03b4e4732f77552f&p=976ada15d9c341ad1cbe9b7c515486&newp=99769a4786cc41af5aa7ca28425285231610db2151d4d517&user=baidu
Reactor框架是ACE各個框架中最基礎(chǔ)的一個框架,其他框架都或多或少地用到了Reactor框架。本章先分析Reactor構(gòu)架模式的基本原理,然后利用ACE Reactor框架實現(xiàn)我們在第1章分析的服務(wù)端程序,最后分析Reactor框架的實現(xiàn)。?
Reactor框架的內(nèi)容非常多,我們并沒有將所有功能“一鍋端”,而是按照Reactor框架處理的事件類型逐一進(jìn)行分析。Reactor框架支持的事件類型包括I/O事件、信號量事件、定時器事件和Notify事件。我們的示例應(yīng)用屬于I/O事件,所以先從I/O事件開始分析。?
2.1?? Reactor構(gòu)架模式?
對每一個構(gòu)架模式的分析,我們都使用參考文獻(xiàn)[14]的分析風(fēng)格,著重分析意圖、上下文、問題、解決方案、結(jié)構(gòu)和實現(xiàn)6個方面的內(nèi)容。而實現(xiàn)就是ACE源代碼。?
1. 意圖?
在事件驅(qū)動的應(yīng)用中,將一個或多個客戶的服務(wù)請求分離(demultiplex)和調(diào)度(dispatch)給應(yīng)用程序。?
2. 上下文?
在事件驅(qū)動的應(yīng)用中,同步地、有序地處理同時接收的多個服務(wù)請求。?
3. 問題?
在分布式系統(tǒng)尤其是服務(wù)器這一類事件驅(qū)動應(yīng)用中,雖然這些請求最終會被序列化地處理,但是必須時刻準(zhǔn)備著處理多個同時到來的服務(wù)請求。在實際應(yīng)用中,這些請求總是通過一個事件(如CONNECTOR、READ、WRITE等)來表示的。在有序地處理這些服務(wù)請求之前,應(yīng)用程序必須先分離和調(diào)度這些同時到達(dá)的事件。為了有效地解決這個問題,我們需要做到以下4方面:?
q 為了提高系統(tǒng)的可測量性和反應(yīng)時間,應(yīng)用程序不能長時間阻塞在某個事件源上而停止對其他事件的處理,這樣會嚴(yán)重降低對客戶端的響應(yīng)度。?
q 為了提高吞吐量,任何沒有必要的上下文切換、同步和CPU之間的數(shù)據(jù)移動都要避免。?
q 引進(jìn)新的服務(wù)或改良已有的服務(wù)都要對既有的事件分離和調(diào)度機(jī)制帶來盡可能小的影響。?
q 大量的應(yīng)用程序代碼需要隱藏在復(fù)雜的多線程和同步機(jī)制之后。?
4. 解決方案?
在一個或多個事件源上等待事件的到來,例如,一個已經(jīng)連接的Socket描述符就是一個事件源。將事件的分離和調(diào)度整合到處理它的服務(wù)中,而將分離和調(diào)度機(jī)制從應(yīng)用程序?qū)μ囟ㄊ录奶幚碇蟹蛛x開,也就是說分離和調(diào)度機(jī)制與特定的應(yīng)用程序無關(guān)。?
具體來說,每個應(yīng)用程序提供的每個服務(wù)都有一個獨立的事件處理器與之對應(yīng)。由事件處理器處理來自事件源的特定類型的事件。每個事件處理器都事先注冊到Reactor管理器中。Reactor管理器使用同步事件分離器在一個或多個事件源中等待事件的發(fā)生。當(dāng)事件發(fā)生后,同步事件分離器通知Reactor管理器,最后由Reactor管理器調(diào)度和該事件相關(guān)的事件處理器來完成請求的服務(wù)。?
5. 結(jié)構(gòu)?
在Reactor模式中,有5個關(guān)鍵的參與者。?
q 描述符(handle):由操作系統(tǒng)提供,用于識別每一個事件,如Socket描述符、文件描述符等。在Linux中,它用一個整數(shù)來表示。事件可以來自外部,如來自客戶端的連接請求、數(shù)據(jù)等。事件也可以來自內(nèi)部,如定時器事件。?
q 同步事件分離器(demultiplexer):是一個函數(shù),用來等待一個或多個事件的發(fā)生。調(diào)用者會被阻塞,直到分離器分離的描述符集上有事件發(fā)生。Linux的select函數(shù)是一個經(jīng)常被使用的分離器。?
q 事件處理器接口(event handler):是由一個或多個模板函數(shù)組成的接口。這些模板函數(shù)描述了和應(yīng)用程序相關(guān)的對某個事件的操作。?
q 具體的事件處理器:是事件處理器接口的實現(xiàn)。它實現(xiàn)了應(yīng)用程序提供的某個服務(wù)。每個具體的事件處理器總和一個描述符相關(guān)。它使用描述符來識別事件、識別應(yīng)用程序提供的服務(wù)。?
q Reactor管理器(reactor):定義了一些接口,用于應(yīng)用程序控制事件調(diào)度,以及應(yīng)用程序注冊、刪除事件處理器和相關(guān)的描述符。它是事件處理器的調(diào)度核心。Reactor管理器使用同步事件分離器來等待事件的發(fā)生。一旦事件發(fā)生,Reactor管理器先是分離每個事件,然后調(diào)度事件處理器,最后調(diào)用相關(guān)的模板函數(shù)來處理這個事件。?
通過上述分析,我們注意到,是Reactor管理器而不是應(yīng)用程序負(fù)責(zé)等待事件、分離事件和調(diào)度事件。實際上,Reactor管理器并沒有被具體的事件處理器調(diào)用,而是管理器調(diào)度具體的事件處理器,由事件處理器對發(fā)生的事件做出處理。這就是類似Hollywood原則的“反向控制”。應(yīng)用程序要做的僅僅是實現(xiàn)一個具體的事件處理器,然后把它注冊到Reactor管理器中。接下來的工作由管理器來完成。這些參與者的相互關(guān)系如圖2-1所示。?
現(xiàn)在結(jié)合第1章分析的框架五元素來看一下Reactor構(gòu)架模式的參與者與框架五元素之間的關(guān)系:Reactor構(gòu)架模式的具體實現(xiàn)對應(yīng)了元素1;事件處理器接口對應(yīng)元素2;具體的事件處理器對應(yīng)元素3;Reactor管理器使用了Hollywood原則,可以認(rèn)為和元素5對應(yīng);元素4的功能相對不明顯,沒有明確的對應(yīng)關(guān)系。?
如果還是沒有理解Reactor構(gòu)架模式,沒有關(guān)系,源代碼會說明所有問題。此時可再分析一遍Reactor構(gòu)架模式,然后繼續(xù)以下內(nèi)容。?
?
?
圖2-1?? Reactor構(gòu)架模式結(jié)構(gòu)圖
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3790442.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Reactor构架模式--转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式服务框架 Zookeeper --
- 下一篇: JDK源码重新编译——支持eclipse