對每乙個構架模式的分析,我們都使用參考文獻的分析風格,著重分析意圖、上下文、問題、解決方案、結構和實現 6個方面的內容。而實現就是ace源**。
在事件驅動的應用中,將乙個或多個客戶的服務請求分離(demultiplex)和排程(dispatch)給應用程式。
在事件驅動的應用中,同步地、有序地處理同時接收的多個服務請求。
在分布式系統尤其是伺服器這一類事件驅動應用中,雖然這些請求最終會被序列化地處理,但是必須時刻準備著處理多個同時到來的服務請求。在實際應用 中,這些請求總是通過乙個事件(如connector、read、write等)來表示的。在有序地處理這些服務請求之前,應用程式必須先分離和排程這些 同時到達的事件。為了有效地解決這個問題,我們需要做到以下4方面:
在乙個或多個事件源上等待事件的到來,例如,乙個已經連線的socket描述符就是乙個事件源。將事件的分離和排程整合到處理它的服務中,而將分離和排程機制從應用程式對特定事件的處理中分離開,也就是說分離和排程機制與特定的應用程式無關。
具體來說,每個應用程式提供的每個服務都有乙個獨立的事件處理器與之對應。由事件處理器處理來自事件源的特定型別的事件。每個事件處理器都事先註冊 到reactor管理器中。reactor管理器使用同步事件分離器在乙個或多個事件源中等待事件的發生。當事件發生後,同步事件分離器通知 reactor管理器,最後由reactor管理器排程和該事件相關的事件處理器來完成請求的服務。
在reactor模式中,有5個關鍵的參與者。
通過上述分析,我們注意到,是reactor管理器而不是應用程式負責等待事件、分離事件和排程事件。實際上,reactor管理器並沒有被具體的 事件處理器呼叫,而是管理器排程具體的事件處理器,由事件處理器對發生的事件做出處理。這就是類似hollywood原則的「反向控制」。應用程式要做的 僅僅是實現乙個具體的事件處理器,然後把它註冊到reactor管理器中。接下來的工作由管理器來完成。這些參與者的相互關係如圖2-1所示。
現在結合第1章分析的框架五元素來看一下reactor構架模式的參與者與框架五元素之間的關係:reactor構架模式的具體實現對應了元素1; 事件處理器介面對應元素2;具體的事件處理器對應元素3;reactor管理器使用了hollywood原則,可以認為和元素5對應;元素4的功能相對不 明顯,沒有明確的對應關係。
如果還是沒有理解reactor構架模式,沒有關係,源**會說明所有問題。此時可再分析一遍reactor構架模式,然後繼續以下內容。
圖2-1 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框架結構要比reactor構架模式中分析的結構複雜得多。這是因為ace的reactor框架除了處理i/o事件之 外,還要處理定時器、訊號量等常見的事件,並且所有的這些處理都必須滿足跨平台的要求。要將對這些事件的處理抽象出來,並且提供給應用程式乙個統一的接 口,ace的reactor管理器的實現還採用了facade設計模式。實際上,reactor框架管理的i/o事件、訊號量事件、定時器事件和 notify事件在實現上都有乙個小的元件與之對應,這樣可以將reactor管理器與具體的事件處理解耦。使用facade設計模式,將這些小的元件的 介面封裝起來,使得應用程式無法感知它們的存在,可以減少應用程式處理物件的數目,並且使得這些小的元件使用起來更加方便。
以上分析的3種設計模式以及factory設計模式,在ace的框架管理器的實現中被頻繁使用。這些設計模式以及它們的使用,既為我們學習設計模式 提供了非常好的場景,又為我們實現軟體框架管理器提供了實用的方法。ace的reactor框架與框架五元素的對應關係非常密切,是乙個典型的事件驅動型 框架,它為我們開啟了ace的框架之門,是學習其他框架的基礎。
在深入到框架**之前,我們先來看乙個reactor框架的使用示例,示例雖然簡單,但卻提供了乙個實實在在的應用程式,也為我們的分析提供了一些思路。
reactor設計模式
reactor設計模式,是一種基於事件驅動的設計模式。pattern oriented software architecture,volume 2 對這個模式做了詳細的講解。這個模式的結構圖如下 圖中的handle對應的是作業系統提供的控制代碼,例如i o控制代碼,event handler類持有...
設計模式 reactor
先看個段子吧,更好理解 reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,...
Reactor設計模式
reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,節省系統的資源,提高系統...