Pattern-Oriented Software Architecture v1巨詳細讀書筆記 7

 本筆記是《Pattern-Oriented Software Architecture vol.1 A system of patterns》原書[page 307-312]的山寨翻譯:),包括了Forwarder-Receiver模式的前半部分。
----------------------------------------------

[307]
Forwarder-Receiver
Forwarder-Receiver設計模式爲實現點對點交互模型的軟件系統提供了透明的進程間通信,它引入forwarder和receiver使peers從底層通信機制中解偶。

[例子]
DwarfWare公司提供管理計算機網絡的應用程序,在一個新的項目中,開發組已經定義了一個網絡管理的基礎架構。用java寫成的運行在每個可用的網絡節點中的Agent進程組成了系統,這些agent負責觀察並監控事件和資源,另外他們還允許網絡管理員控制和更改網絡的行爲,如:更改路由表。爲了能交換信息,也爲了快速的傳播管理命令,每個agent都用點對點的方式連接到遠程的agent,都會根據需要扮演client或是server的角色。作爲基礎架構,需要支持大量不同的硬件和軟件系統,端點之間的通信不應該依賴於特定的進程間通信機制。
[圖]

[308]
[環境]
點對點通信。

[問題]
構建分佈式應用程序的方式通常是採用如TCP/IP、socket或消息隊列等可用的底層IPC(進程間通信,inter-process communication)機制,幾乎所有的操作系統都提供這些機制,並且同上層機制(如:RPC-remote procedure call)相比這些底層機制效率都非常高,然而這些底層機制通常依賴於更底層的操作系統和網絡協議。採用特定的IPC機制限制了可移植性,強制要求系統提供支持異種環境的能力,使得以後很難變換IPC機制。
當你需要平衡以下的強制條件時,Forwarder-Receiver模式就很有用:
    - 系統應該允許變換通信機制。
    - 協作中的組件間遵循點到點的模型,其中的發送端只需要知道接收端的名字。
    - peers之間的通信不應該對性能造成很大的衝擊。

[解決方案]
分佈的peers相互合作以解決特定的問題,一個peer作爲客戶端請求服務,一個作爲服務器端提供服務,或者由同一個peer扮演兩種角色。發送和接收消息這種底層IPC機制的細節及特定的系統功能(如:映射名字到物理位置,建立通信通道,編碼/解碼消息等),都被封裝在獨立的組件中,隱藏在peer之外。
[結構]
Forwarder-Receiver設計模式由Forwarder、receiver和peer這3種組件組成:
Peer組件負責應用程序的任務,爲了完成任務它需要同其他peer通信,這些peer可能位於不同進程中,甚至位於不同的機器中。每個peer都知道它需要通信的遠程peer的名字,它用forwarder發送消息給其他peer,用receiver從其他peer接收消息,這些消息是一個peer發送給遠程peer的請求,或者是請求的響應。
[309]
在我們的DwarfWare例子中,Peer就是運行在網絡節點上的Agent。他們持續地監視網絡事件和資源,並監聽從遠程agent傳入的消息,每個agent可以連接到任意的其他agent交換信息或提交請求。(??)爲了讓管理者操控網絡活動和事件,網絡管理基礎架構使管理控制檯和所有其他的agent連接起來,管理者可用管理控制檯給網絡中的agent發送請求或接收他們發送回的消息。
[圖]

Forwarder組件跨進程邊界發送消息,提供從特定的IPC機制抽象出的通用接口,此接口包括消息的編碼和分發功能,也包括名字到物理地址的映射。當forwarder發送消息到遠程peer時,它用名字到地址的映射關係找到接收端的物理位置,在發送的消息中forwarder描述了他自己所在peer的名字,這樣遠程peer就能向消息發送源回送響應。
在我們的例子中有集中不同的消息存在:
    - 命令消息,指示接收端執行某些動作,如:更改所在主機的路由表。
    - 信息消息,包含網絡資源和事件數據。
[310]
    - 響應消息,允許agent知曉消息已經到達。
forwarder組件負責轉發所有這些消息給遠程網絡agent,同時屏蔽掉對底層IPC機制的任何依賴。

Receiver組件負責接收消息,提供從特定的IPC機制抽象出的通用接口,包括功能:消息接收和解碼。
在我們的例子中,receiver代表agent進程等待輸入的消息,一旦有消息到達,他們將接收到的數據流轉變成通用的消息格式並轉發給agent進程。
[圖]
下圖顯示了Forwarder-Receiver設計模式的靜態關係。
爲了發送消息給遠程peer,本地peer用消息做爲參數調用它forwarder的sendMsg方法。sednMsg調用mashal將消息轉換成底層IPC機制能理解的格式,然後用deliver將IPC格式的消息數據傳送給遠程receiver。
當本地peer要接收從遠程peer送來的消息時,它調用receiver的receiveMsg方法,在返回值中能得到消息。receiveMsg調用了用底層IPC機制接收IPC消息的receive方法,收到消息後receiveMsg調用unmashal將IPC消息轉換成peer能理解的格式。

[page 311]
[圖]
[動態]
以下的場景圖示了典型的使用Forwarder-Receiver結構的例子。2個名爲P1和P2的peer相互通信,P1用名爲Forw1的forwarder和名爲Recv1的Receiver同P2通信,P2用名爲Forw2的forwarder和名爲Recv2的receiver處理傳輸的消息:
    - P1向遠程的P2請求服務,它向Forw1發送請求並且指定接收端的名稱。
    - Forw1確定遠端的物理位置,並將消息編碼。
    - Forw1將消息發送給名爲Recv2的遠程receiver。
    - 在之前某個時間,P2請求Recv2等待接收請求,現在Recv2接收到從Forw1發送來的消息。
    - Recv2將消息解碼並轉發給它名爲P2的peer。
[page 312]
    - 同時,P1調用他的Recv1等待響應。
    - P2執行被請求的服務,併發送結果和接收端P1的名字到Forw2,此forwarder將結果編碼併發送給Recv1。
    - Recv1從P2接收到響應,將響應解碼後發送給P1。
[圖]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章