大型的企業級系統是如何設計的呢?想必大家都曾經有過這樣的疑惑。大型軟體開發前,我們必須選擇一種合適的架構,它既要提供我們想要的功能,質量也要過關。因此,在應用不同的架構之前,我們有必要熟悉一下這些架構。
什麼是架構模式?
根據維基百科,
針對軟體架構中給定上下文的常見問題,架構模式是一種通用的、可複用的解決方案。它與軟體設計模式相似,但範圍更廣。
在這篇文章中,我將簡要地說明一下10種常用的架構模式,以及它們的用法和利弊。
- 分層模式
- 客戶端 – 服務端模式(cs模式)
- 主從模式
- 管道過濾器模式
- 代理模式
- 點對點模式
- 事件匯流排模式
- 模型-檢視-控制器模式(MVC模式)
- 黑板模式
- 直譯器模式
1. 分層模式
這種模式可用於構建能分解成多組子任務的程式,每個子任務處在特定的抽象級別中。每一層為更高一層提供服務。
以下是最常見的通用資訊系統中的4個層次。
- 表示層(亦稱為 UI層)
- 應用層(亦稱為 服務層)
- 業務邏輯層(亦稱為 領域層)
- 資料訪問層(亦稱為 持久層)
用法
- 通用桌面應用
- 電子商務web應用
2. 客戶端-服務端模式
該模式包含一個服務端和多個客戶端。服務端元件給多個客戶端元件提供服務。客戶端向服務端請求服務,服務端提供相關的服務。此外,服務端會持續監聽客戶端的請求。
用法
- 線上應用,例如電子郵件、檔案共享和儲存。
3. 主從模式
該模式包含兩部分;主和從。主元件給相同的從屬元件分配工作,並根據從 從屬元件 中返回的結果計算最終結果.
用法
- 主伺服器是權威來源,從屬資料庫與其進行同步。
- 在計算機系統中,外圍裝置連線到匯流排中(主驅動和從屬驅動)。
4. 管道過濾模式
該模式可用於構建生成和處理資料流的系統。每個處理步驟包含在一個過濾元件中。待處理的資料通過管道傳遞。這些管道可用於資料快取或同步。
用法
- 編譯器。連續的過濾器執行詞法分析,解析,語意分析,和程式碼生成。
- 生物資訊學中的工作流。
5. 代理模式
該模式用於構建伴有解耦元件的分散式系統。這些元件通過遠端服務呼叫來和彼此互動。代理元件負責協調元件之間的通訊。
伺服器將其功能(服務和特性)釋出到代理。客戶端從代理請求服務,代理根據登錄檔把客戶端重定向到合適的服務。
用法
- 訊息代理服務,例如Apache ActiveMQ, Apache Kafka,RabbitMQ和JBoss Messaging。
6. 點對點模式
在該模式中,相同的元件被稱為對等元件。對等體既可以作為客戶端,請求其他對等體的服務,也可以作為服務端,為其他對等體提供服務。一個對等體可以作為客戶端、或者服務端、或者兼任兩者,它能隨著時間動態變更自己的角色。
用法
7. 事件匯流排模式
該模式主要處理事件,並且有4個主要元件:事件源,事件監聽者,事件通道和事件匯流排。事件源釋出訊息到事件匯流排上的特定通道。監聽者訂閱特定通道。如果監聽者訂閱的通道有訊息釋出,那麼監聽者就會得到通知。
用法
- 安卓開發
- 通知服務
8. 模型-檢視-控制器模式(MVC模式)
該模式亦被稱為MVC模式,它將互動式應用分成3個部分,
- 模型 – 包含核心功能和資料
- 檢視 – 給使用者展示資訊(可能不止一個檢視)
- 控制器 – 處理使用者的輸入 這樣做的目的是將 資訊的內部表示 和 資訊呈現給使用者並且從使用者獲取的方式 分離開。這樣能解耦元件並且有效重用程式碼。
用法
9. 黑板模式
該模式可用於沒有已知確定性解決方案策略的問題。黑板模式由3個主要元件組成。
- 黑板 – 一塊結構化的全域性記憶體,包含解決方案空間的物件。
- 知識源 – 具有各自代表性的專業模組。
- 控制元件 – 選擇,配置和執行模組。 所有元件都可以訪問黑板。元件可能會生產新增進黑板的新資料物件。元件在黑板上尋找特定型別的資料,並且可能利用已有的知識源,通過模式匹配的方式來尋找資料。
用法
- 語音識別
- 車輛識別和追蹤
- 蛋白質結構識別
- 海納訊號解析
10. 直譯器模式
該模式用於設計 用來解釋專用語言寫成的程式 的元件。它主要指明如何評估程式的行,即用特定語言編寫的語句或表示式。基本想法是為語言的每個符號設定一個類。
用法
- 資料庫查詢語言,例如SQL。
- 計算機語言用來描述通訊協議。
架構模式的優劣比較
下面的圖表總結了各種架構模式的優劣。
名字 | 優勢 | 劣勢 |
---|---|---|
分層模式 | 低層級的元件能被不同的高層級元件呼叫。可以清晰地定義層級,所以層級化更容易標準化。當在層級內改動時不會影響到其他層級 | 不是普遍適用的。在某種情況下,某些層級可能會被跳過 |
客戶端-服務端模式 | 能很好地對客戶端請求的服務進行建模 | 請求被分到服務端的不同的執行緒中處理。因為不同的客戶端有不同的展示形式,程式間通訊會導致額外開銷。 |
主從模式 | 準確性 – 服務被代理到具有不同實現的從屬元件中執行 | 從屬元件彼此隔離:之間沒有共享狀態。主從通訊的延遲在某些場景下是個問題,例如實時系統。這種模式只可以被用來解決能被分解的問題。 |
管道過濾模式 | 並行處理。當輸出和輸出都是流資料,過濾器一旦收到資料便開始計算。易於增加過濾器,系統擴充套件性好。過濾器可以複用。可以通過已有過濾器的重新組合來構建不同的管道 | 效率會受限於最慢的過濾處理器。把資料從一個過濾器轉移到另一箇中時,存在資料轉換的開銷。 |
代理模式 | 允許物件動態變化,增加、減少和遷移,並且物件分佈對開發者是透明的。 | 需要服務描述標準化。 |
點對點模式 | 支援分散式計算。對於任意失敗節點的高健壯性。取決於資源和計算效率的高擴充性。 | 由於各個節點是自願合作的,服務質量無法保證。安全性很難保證。效能取決於節點數量。 |
事件匯流排模式 | 易於新增釋出者、訂閱者和連線。該模式對於高分散式應用很奏效。 | 該模式的可擴充性可能是個問題,因為所有訊息都通過同一個事件匯流排傳輸。 |
模型-檢視-控制器模式 | 相同的模型可以輕鬆擁有多個檢視,可以在執行時建立連線和斷開連線。 | 複雜度增加。可能導致使用者操作的許多不必要的更新。 |
黑板模式 | 易於新增應用。易於擴充套件資料空間的結構。 | 很難修改資料空間的結構,因為會影響所有應用。可能需要同步和訪問控制。 |
直譯器模式 | 有可能實現高度動態行為。有利於終端使用者的可程式設計性。提高靈活性,因為易於替換解釋程式碼。 | 因為解釋語言的執行速度一般比編譯語言慢,所以效能可能是個問題。 |