深入解析 18 種軟件架構設計模式 (6)- 最終篇
架構模式通過提供可複用的設計方案,有助於解決常見的軟件設計挑戰,從而提升生產力。如果您從事軟件架構設計工作,可能會遇到重複的目標和問題。架構模式通過提供應對這些場景的可重複設計,幫助開發者更高效地解決這些問題。
架構模式捕獲了各類系統和軟件要素的設計結構,使其可以被複用。在編寫代碼的過程中,開發者往往在項目內、公司內乃至職業生涯中多次遇到類似問題。通過創建設計模式,工程師們可以藉助一種可複用的方法來解決問題,結構化地實現項目目標。
- CQRS:Command Query Responsibility Segregation Pattern, Command Query 讀寫分離架構 ===============================================================================
Command Query Responsibility Segregation Pattern(CQRS)模式將服務的寫入任務與讀取任務分離。對於小型應用程序來說,讀取和寫入同一個數據庫是可以接受的。然而,在需要支持大規模分佈式應用程序的場景中,這種方式顯得力不從心。通常情況下,讀取操作的頻率遠高於寫入操作。此外,讀取操作是不可變的,因此專門用於讀取數據的副本可以分佈在不同的地理位置。這種方式允許用戶訪問離他們最近的數據,從而提升企業應用程序的效率。
CQRS 的優勢
-
針對性數據庫技術的應用 將寫入任務和讀取任務分離可以讓開發者針對不同任務選擇最佳的數據庫技術。例如,可以使用 SQL 數據庫處理寫入任務,使用非 SQL 數據庫處理讀取任務。
-
提升讀取性能 由於讀取操作通常比寫入操作頻繁,通過將讀取數據源放置在戰略性地理位置,可以降低響應延遲,提升性能。
-
更高效的存儲擴展 通過分離讀取和寫入任務,可以根據實際使用情況更高效地擴展存儲容量。
CQRS 的劣勢
-
對多種數據庫技術的要求 實現 CQRS 模式需要對多種數據庫技術有深入的專業知識。
-
更高的成本 使用 CQRS 模式需要更多的數據庫技術,這意味着硬件成本增加,或者如果使用雲服務,則會增加使用費用。
-
數據一致性問題 在保障數據一致性時,需要特別考慮服務級別協議(SLA),這涉及到 CAP 定理的權衡。
-
更多的潛在故障點 使用大量數據庫意味着故障點的數量增加。因此,公司需要實施全面的監控和故障安全機制,以確保系統的正常運行。
CQRS 模式是一種適用於大規模分佈式系統的架構模式,儘管帶來了更高的複雜性和成本,但其性能和擴展性優勢使其成爲許多現代企業應用的選擇。
- 節流架構模式(Throttling Architecture Pattern) ===========================================
節流模式(Throttling Pattern),也被稱爲速率限制(Rate Limiting),是在目標服務或進程前設置節流器(Throttle)以控制數據流入目標的速度的架構模式。這種技術通過調控流入目標的數據速率,確保其能夠以可接受的速度消化數據。如果目標服務出現負載過重的情況,節流器會減緩甚至停止對目標服務的調用。
節流模式的核心是控制數據流入目標的速度,它常被用於以下場景: • 防止分佈式拒絕服務(DDoS)攻擊引發的服務失敗; • 管理雲基礎設施成本,防止因資源過載導致額外費用。
爲了成功實施這一模式,通常需要具備良好的冗餘機制,並經常與斷路器模式(Circuit Breaker Pattern)結合使用,以保持服務性能的穩定性。
節流模式的關鍵用途
-
防禦分佈式拒絕服務(DDoS)攻擊 在 DDoS 攻擊中,大量的請求可能在短時間內湧入服務。節流器通過限制請求速率,減少目標服務因流量激增導致的故障風險。
-
優化資源使用與成本 在雲服務中,按使用量收費的商業服務需要嚴格管理請求的速率。節流模式可以有效地限制請求頻率,防止超額使用資源導致成本增加。
-
提高系統彈性與穩定性 節流模式通過控制請求速率,減少目標服務因瞬時負載過高而出現的性能瓶頸,同時保障其他系統或服務的正常運行。
節流模式的實現類型
-
客戶端節流 客戶端節流通過限制客戶端發出的調用頻率,避免超出目標服務的負載能力。常用於需要按使用量計費的商業服務,例如支付網關、第三方 API 接口等。
-
服務器端節流 在服務器端,通過流量控制組件,例如網關、負載均衡器或專用的節流器模塊,限制進入目標服務的請求速率。這種方式更加靈活,可以動態調整速率限制以適應目標服務的運行狀態。
節流模式的實施技術
-
令牌桶算法(Token Bucket) 令牌桶是一種常見的速率限制算法。系統按照設定速率生成令牌,只有持有令牌的請求才能通過。如果令牌耗盡,請求將被拒絕或延遲處理。
-
漏桶算法(Leaky Bucket) 漏桶算法將請求按照恆定的速率處理。如果請求速率超過系統處理能力,多餘的請求會被丟棄。
-
滑動窗口算法(Sliding Window) 滑動窗口通過跟蹤一定時間窗口內的請求數量來控制速率。相比於固定窗口算法,它可以更平滑地處理突發流量。
節流模式的實踐建議
-
結合斷路器模式 節流器主要用於調控流量,但如果目標服務已經出現故障,可以配合斷路器模式迅速切斷流量,保護服務的可用性。
-
監控與報警 實時監控流量和節流器的工作狀態,配合報警機制,能夠幫助開發者快速發現和處理異常。
-
動態調整速率限制 根據目標服務的實時負載情況,動態調整節流速率限制,既可以提升資源利用率,也能避免過度限制導致的用戶體驗下降。
節流架構模式是現代分佈式系統中常用的一種性能優化手段。它不僅能保護目標服務免受高流量衝擊,還能有效控制資源成本。通過結合合適的算法與其他架構模式,例如斷路器模式,開發者可以構建出更加彈性和高效的系統。
在實踐中,節流模式的成功實施離不開對技術細節的深入理解和對運行環境的持續優化。企業可以根據自身需求選擇合適的節流實現方式,從而最大化系統的穩定性與成本效益。
- 數據分片架構模式(Sharding Architecture Pattern) ===========================================
數據分片模式(Sharding Pattern)是一種通過將數據庫中的數據劃分爲多個片(Shard)來加速命令執行或查詢的架構模式。這種模式不僅能夠確保存儲負載在多個實例之間均衡分佈,同時也需要一名具備豐富經驗的數據庫管理員(DBA)對分片進行高效管理。
在數據分片模式中,數據存儲從單個存儲實例分離爲多個獨立的實例,這些實例被稱爲 “分片”。隨後,數據會依據某種邏輯被劃分到各個分片中。查詢操作會針對這些分片執行,而實現分片的數據庫技術需要負責以優化的方式執行查詢。此外,分片還可以基於一種邏輯對數據進行分段,確保磁盤容量在所有實例之間的消耗保持均衡。
數據分片模式的核心概念
-
分片的定義 分片是將大型數據集分隔爲更小的子集,每個子集存儲在單獨的數據庫實例中。每個分片都可以獨立運行,因此整個數據庫系統可以並行處理多個查詢任務,顯著提升性能。
-
分片邏輯 數據分片需要依賴一種明確的分片邏輯。這種邏輯決定了數據如何劃分到各個分片中,常見的分片邏輯包括: 範圍分片(Range Sharding):根據某個字段的值範圍將數據劃分到不同的分片,例如按照用戶 ID 範圍分配數據。 哈希分片(Hash Sharding):對某個字段的值進行哈希計算,並根據哈希值將數據映射到不同的分片。 地理分片(Geographical Sharding):基於地理位置或區域信息劃分數據。
-
查詢優化 數據分片後,查詢操作需要根據分片邏輯定位目標分片,從而避免掃描整個數據庫。數據庫技術需要通過路由和索引優化分片查詢,確保高效的數據訪問。
數據分片模式的優勢
-
提高系統性能 通過分片,將查詢任務分散到多個數據庫實例中,可以顯著提高查詢速度並降低單個實例的負載。
-
增強系統可擴展性 數據分片模式支持水平擴展。當數據量增加時,可以通過添加更多分片實例來應對增長需求。
-
提升資源利用效率 通過分片邏輯均衡地分配數據,存儲和計算資源可以更高效地被利用,避免單點過載的情況。
數據分片模式的挑戰
-
分片邏輯的複雜性 設計和實施合適的分片邏輯需要深入理解數據結構和訪問模式。不當的分片邏輯可能導致查詢效率低下或分片不均衡。
-
分片管理的難度 分片系統的維護需要專業技能,包括監控負載均衡、調整分片規模以及處理分片遷移等任務。
-
跨分片查詢的性能開銷 跨多個分片的查詢需要協調多個數據庫實例的操作,這可能導致查詢延遲增加,尤其是在分片邏輯複雜的情況下。
-
數據一致性問題 在多分片環境下,確保數據一致性是一個重要挑戰,尤其是在涉及事務處理或高併發的場景中。
數據分片架構模式是應對大規模數據存儲和查詢需求的關鍵解決方案。它通過分散數據存儲和查詢任務,不僅提升了系統性能,還增強了擴展性。然而,這種模式也對設計和運維提出 了更高的要求。通過合理的分片策略、專業的管理能力和高效的數據庫技術支持,企業可以充分發揮數據分片模式的優勢,爲現代分佈式系統提供強大的支撐。
- Static Content Hosting Architecture Pattern 靜態內容託管架構模式 ==========================================================
靜態內容託管模式用於優化網頁加載時間。它將靜態內容(例如作者簡介或 MP3 文件等不經常變化的信息)與動態內容(例如股票價格等)分開存儲。對於那些不經常變化的內容和媒體,這種模式非常高效。然而,它的缺點包括數據一致性問題和更高的存儲成本。
靜態內容託管模式通過將靜態內容與動態內容分離,並將靜態內容存儲在不同地理位置來實現快速訪問的優化。一個靜態內容的例子是用 HTML 編寫的網頁,其數據變化緩慢,例如作者的簡介。另一個例子是與電影相關的 MP4 文件。而動態內容則是指變化迅速、並在請求時即時生成的數據,例如當前股票價格列表。
- Strangler Architecture Pattern 扼殺者(Strangler)架構模式 =====================================================
扼殺者模式是一種將 “舊” 系統放置在中介外觀(facade)背後的架構模式。隨着時間推移,針對舊系統的外部替代服務逐步添加到該外觀之後。外觀代表了現有系統的功能入口點,所有對舊系統的調用都通過外觀傳遞。在外觀的背後,舊系統中的服務被重構爲一組新的服務。
當新的服務開始運行時,中介外觀會被修改,將原本路由到舊系統服務的調用重新指向新的服務。最終,舊系統中的服務被新的服務逐步取代,從而實現對舊服務的 “扼殺”。
通過這一模式,系統可以在不破壞現有功能的前提下實現逐步演化,降低了風險並提高了系統遷移的可控性。
總結:軟件架構是構建成功軟件系統的基石
軟件架構對於構建滿足用戶和利益相關者需求的成功軟件系統至關重要。它爲軟件系統的設計和開發提供了藍圖,不僅確保系統能夠滿足功能性和非功能性需求,還促進了適應性並有助於管理複雜性。因此,在軟件開發項目初期,投入時間和資源設計一個穩健的架構是至關重要的。這種投入可以爲後續開發奠定堅實基礎,減少潛在問題的發生,並確保系統的長期成功與可持續性。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/_UEGTsQ-om4szsWK8NBtVA