天天看點

多層分布式設計模式

  原來就想寫一些關于分布式的設計。正好目前開發的gix4項目中,需要對用戶端的許多操作進行記錄。這個功能的設計或多或少能說明,一般情況下,多層的分布式系統應該如何設計。現在我就對這個功能進行描述。

功能描述

    需要把客戶的所有操作記錄下來,以便支援審計。如,當使用者進行:登入、打開子產品、檢視資料、點選按鈕……等操作時,把相關的資料全部在伺服器的資料庫中記錄下來,這些資料有:操作類型、操作時間、操作内容、操作者、用戶端機器名等。

    在服務端對某些特定的事件進行記錄,如:計算出錯。

設計目标

    這個子產品需要支援以下目标:

    *為用戶端代碼、伺服器端代碼都提供簡單統一的接口。

    *需要異步記錄。

    *如果擴充為多級實體層時,也需要使用相同的接口。

設計

    先把設計完成的圖貼出來,然後再逐一描述:

多層分布式設計模式

圖1 全部類圖

通用部分

    首先,api設計之初,先根據需求,定出使用的接口。它們包含兩個類:一個是貧血資料類auditlogitem,一個是對auditlogitem進行操作的靜态類auditlogservice。auditlogservice暫時公布兩個靜态方法,一個記錄日志方法log(),另一個方法是異步記錄logasync()。如下:

多層分布式設計模式

    除了最終與資料庫通信的伺服器外,其它節點都預設使用clientauditlogprovider作為提供程式。此提供程式使用了icommunication,而icommunication則是負責向“下一節點”通信并送出日志記錄功能。

gix4實作部分

    這部分主要是兩個類:serverauditlogprovider 和 cslacommandcommunication。

    serverauditlogprovider 使用csla的類庫把auditlogitem轉換為相應的資料庫模型存入資料庫中:

    cslacommandcommunication 則是使用wcf和csla指令模式作為基礎架構,讓目前節點把請求發送給下一節點,下一節點接到請求後,使用本節點的提供程式provider來處理請求。其中重要的代碼在内部類auditservercommand中,如下:

整個過程

    整個過程其實很簡單,一圖勝千言:

多層分布式設計模式

後記

    其實本次設計過程的思路很簡單:分析要提供的api(場景驅動)、分析分布式實作的差異、編寫基礎部分、編碼與重構。

    其實熟悉csla的人應該知道,它裡面的通信機制也是采用了類似的方式實作的。是以這應該算是一種分布式的設計模式吧。 :)