Reactor架構是ACE各個架構中最基礎的一個架構,其他架構都或多或少地用到了Reactor架構。本文分析Reactor構架模式的基本原理。
2.1 Reactor構架模式
對每一個構架模式的分析,我們都使用參考文獻的分析風格,著重分析意圖、上下文、問題、解決方案、結構和實現 6個方面的內容。而實現就是ACE原始碼。
1. 意圖
在事件驅動的應用中,將一個或多個客戶的服務要求分離(demultiplex)和調度(dispatch)給應用程式。
2. 上下文
在事件驅動的應用中,同步地、有序地處理同時接收的多個服務要求。
3. 問題
在分布式系統尤其是伺服器這一類事件驅動應用中,雖然這些請求最終會被序列化地處理,但是必須時刻準備著處理多個同時到來的服務要求。在實際應用中,這些請求總是通過一個事件(如CONNECTOR、READ、WRITE等)來表示的。在有序地處理這些服務要求之前,應用程式必須先分離和調度這些同時到達的事件。為了有效地解決這個問題,我們需要做到以下4方面:
- 為了提高系統的可測量性和反應時間,應用程式不能長時間阻塞在某個事件來源上而停止對其他事件的處理,這樣會嚴重降低對用戶端的響應度。
- 為了提高輸送量,任何沒有必要的環境切換、同步和CPU之間的資料移動都要避免。
- 引進新的服務或改良已有的服務都要對既有的事件分離和調度機制帶來儘可能小的影響。
- 大量的應用程式代碼需要隱藏在複雜的多線程和同步機制之後。
4. 解決方案
在一個或多個事件來源上等待事件的到來,例如,一個已經串連的Socket描述符就是一個事件來源。將事件的分離和調度整合到處理它的服務中,而將分離和調度機制從應用程式對特定事件的處理中分離開,也就是說分離和調度機制與特定的應用程式無關。
具體來說,每個應用程式提供的每個服務都有一個獨立的事件處理器與之對應。由事件處理器處理來自事件來源的特定類型的事件。每個事件處理器都事先註冊到Reactor管理器中。Reactor管理器使用同步事件分離器在一個或多個事件來源中等待事件的發生。當事件發生後,同步事件分離器通知Reactor管理器,最後由Reactor管理器調度和該事件相關的事件處理器來完成請求的服務。
5. 結構
在Reactor模式中,有5個關鍵的參與者。
- 描述符(handle):由作業系統提供,用於識別每一個事件,如Socket描述符、檔案描述符等。在Linux中,它用一個整數來表示。事件可以來自外部,如來自用戶端的串連請求、資料等。事件也可以來自內部,如定時器事件。
- 同步事件分離器(demultiplexer):是一個函數,用來等待一個或多個事件的發生。調用者會被阻塞,直到分離器分離的描述符集上有事件發生。Linux的select函數是一個經常被使用的分離器。
- 事件處理器介面(event handler):是由一個或多個模板函數組成的介面。這些模板函數描述了和應用程式相關的對某個事件的操作。
- 具體的事件處理器:是事件處理器介面的實現。它實現了應用程式提供的某個服務。每個具體的事件處理器總和一個描述符相關。它使用描述符來識別事件、識別應用程式提供的服務。
- Reactor管理器(reactor):定義了一些介面,用於應用程式控制事件調度,以及應用程式註冊、刪除事件處理器和相關的描述符。它是事件處理器的調度核心。Reactor管理器使用同步事件分離器來等待事件的發生。一旦事件發生,Reactor管理器先是分離每個事件,然後調度事件處理器,最後調用相關的模板函數來處理這個事件。
通過上述分析,我們注意到,是Reactor管理器而不是應用程式負責等待事件、分離事件和調度事件。實際上,Reactor管理器並沒有被具體的事件處理器調用,而是管理器調度具體的事件處理器,由事件處理器對發生的事件做出處理。這就是類似Hollywood原則的“反向控制”。應用程式要做的僅僅是實現一個具體的事件處理器,然後把它註冊到Reactor管理器中。接下來的工作由管理器來完成。這些參與者的相互關係2-1所示。
現在結合第1章分析的架構五元素來看一下Reactor構架模式的參與者與架構五元素之間的關係:Reactor構架模式的具體實現對應了元素1;事件處理器介面對應元素2;具體的事件處理器對應元素3;Reactor管理器使用了Hollywood原則,可以認為和元素5對應;元素4的功能相對不明顯,沒有明確的對應關係。
如果還是沒有理解Reactor構架模式,沒有關係,原始碼會說明所有問題。此時可再分析一遍Reactor構架模式,然後繼續以下內容。
圖2-1 Reactor構架模式結構圖
2.2 Reactor架構概述
從對Reactor構架模式的分析中我們可以看出,要設計和實現一個簡單Reactor架構以支援I/O事件,需要實現兩個組件:事件處理器介面和Reactor管理器。至於其他組件,如同步事件分離器可以使用作業系統提供的select、poll或其他類似的函數;而描述符可以使用檔案描述符或其他可以識別事件的資料結構,一般作業系統都會提供。事件處理器介面包含一系列模板函數,可以根據實際處理的資料進行設計;Reactor管理器肩負著事件的分離和調度,是整個架構設計的核心。
ACE的Reactor架構在Linux平台下使用檔案描述符作為I/O事件的描述符,使用ACE_Event_Handler類作為各類事件的處理器介面。將同步事件分離函數放到Reactor管理器中,這樣使用不同的同步事件分離函數就需要實現不同的Reactor管理器。ACE使用Bridge設計模式解決了這一問題,將與同步事件分離函數相關的操作放到Bridge設計模式的Implementor中。凡是ACE支援的同步事件分離函數都會有一個具體的Implementor與之對應。
ACE的Reactor管理器還提供了用於實現Singleton設計模式的操作,使用這些操作時,一個進程只能有一個全域的Reactor管理器。在調用Singleton設計模式介面時,Reactor管理器會在啟動時根據作業系統的配置選擇一個具體的Implementor。當然,如果你不喜歡這個預設的Implementor,可以通過函數進行更換。為了提高整個系統對事件分離和調度的效能,ACE還允許應用程式建立多個Reactor管理器執行個體。在這種情況下,應用程式將不能調用用於Singleton設計模式的操作,只能直接使用Reactor管理器執行個體對象的方法實現對事件的分離和調度。同時提供這兩種使用方法,可以最大程度地滿足應用程式的苛刻要求。
ACE實現的Reactor架構結構要比Reactor構架模式中分析的結構複雜得多。這是因為ACE的Reactor架構除了處理I/O事件之外,還要處理定時器、訊號量等常見的事件,並且所有的這些處理都必須滿足跨平台的要求。要將對這些事件的處理抽象出來,並且提供給應用程式一個統一的介面,ACE的Reactor管理器的實現還採用了Facade設計模式。實際上,Reactor架構管理的I/O事件、訊號量事件、定時器事件和Notify事件在實現上都有一個小的組件與之對應,這樣可以將Reactor管理器與具體的事件處理解耦。使用Facade設計模式,將這些小的組件的介面封裝起來,使得應用程式無法感知它們的存在,可以減少應用程式處理對象的數目,並且使得這些小的組件使用起來更加方便。
以上分析的3種設計模式以及Factory設計模式,在ACE的架構管理器的實現中被頻繁使用。這些設計模式以及它們的使用,既為我們學習設計模式提供了非常好的情境,又為我們實現軟體架構管理器提供了實用的方法。ACE的Reactor架構與架構五元素的對應關係非常密切,是一個典型的事件驅動型架構,它為我們開啟了ACE的架構之門,是學習其他架構的基礎。
在深入到架構代碼之前,我們先來看一個Reactor架構的使用樣本,樣本雖然簡單,但卻提供了一個實實在在的應用程式,也為我們的分析提供了一些思路。
---------------------------------------------
本文節選自《ACE技術內幕:深入解析ACE架構設計與實現原理》,作者:潘榮。
內容簡介:本書從構架模式、編程樣本和原始碼3個維度系統地對傳統網路架構ACE(Adaptive Communication Environment)的架構設計和實現原理進行了深入分析,它能解決4個方面的問題:第一,協助架構設計者領略軟體架構設計的普適原則和思想,進而設計出自己的軟體架構;第二,協助ACE應用開發人員加深對ACE架構的理解,提升開發水平,更好地去定製和擴充ACE架構,以及解決C++網路通訊中的難題;第三,協助C++開發人員加深C++語言功底,書中有大量對C++原始碼的分析,包括網路編程、動態庫編程和非同步編程等,還涉及10餘個經典的設計模式的解析;第四,增強平台開發人員和軟體架構師的技術修養,ACE的設計和實現都極其優秀,它的實現源碼和架構思想非常值得去學習和研究。
全書一共7章,詳細分析了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Streams等6個架構的架構設計與實現原理。每個架構的分析分為3部分:第一,架構的設計分析,每個架構(除Task架構)都有一個構架模式與之對應,構架模式闡述了架構的設計原理,給出了架構的總體結構,是學習架構的理論基礎;第二,架構的應用分析,每個架構都有一個應用執行個體與之對應,應用執行個體既協助讀者瞭解架構的使用方法,又為讀者提供了一個可以調試的應用程式,便於讀者使用調試器探索架構的內部秘密;第三,架構的實現分析,這是本書的重點,對架構的實現原理進行了詳細的分析,並且對重點的類和流程給出了UML類圖和UML順序圖,可以讓讀者在短時間內掌握架構的實現技術。
互動網購買:http://product.china-pub.com/3662472