雲設計模式介紹以及它們如何幫助應對分散式計算的謬誤 作為構建分散式系統的軟體工程師,我們經常遇到諸如不可靠的網路、延遲問題和安全問題等挑戰。"分散式計算的謬誤"描述瞭如果未解決,可能導致系統故障的常見誤解。但認識到這些陷阱只是開始。真正的問題是:我們如何有效地剋服它們?這就是雲設計模式發揮作用的地方 ...
雲設計模式介紹
以及它們如何幫助應對分散式計算的謬誤
作為構建分散式系統的軟體工程師,我們經常遇到諸如不可靠的網路、延遲問題和安全問題等挑戰。"分散式計算的謬誤"描述瞭如果未解決,可能導致系統故障的常見誤解。但認識到這些陷阱只是開始。真正的問題是:我們如何有效地剋服它們?這就是雲設計模式發揮作用的地方。這些模式為分散式計算固有的挑戰提供了實用的解決方案。本文將探討數據管理、設計、消息傳遞、安全性和可靠性方面的重要雲設計模式。使用這些模式可以讓您在不陷入常見錯誤的情況下,應對分散式系統的複雜性。那麼,讓我們深入探討。
分散式計算的謬誤
作為軟體工程師,我們經常構建跨越多個伺服器、數據中心甚至大陸的系統。分散式計算已成為現代應用程式的支柱,實現了以前難以想象的可擴展性和彈性。然而,儘管它無處不在,但常見的誤解——被稱為“分散式計算的謬誤”。我們收集了“分散式計算的謬誤”的聲明,以說明不熟悉分散式應用程式的程式員經常做出的錯誤假設。我們在創建微服務架構時經常看到的是,應該解決這些謬誤。
以下是謬誤列表:
- 網路是可靠的。這是最關鍵的謬誤。網路本質上是不可靠的,容易出現中斷、延遲和惡意攻擊。分散式系統必須設計得能夠優雅地處理這些不可避免的小問題。
示例:如果微服務應用程式沒有優雅地處理網路超時,可能會導致服務故障。
- 延遲為零。每個動作都有反應,分散式系統也不例外。消息需要時間傳播,計算需要時間完成。忽略延遲可能導致性能瓶頸和不可預測的行為。
示例:如果實時分析平臺沒有考慮數據傳輸延遲,可能會提供過時的見解。
- 帶寬是無限的。雖然帶寬不斷增加,但它並不是無限的。分散式系統經常生成大量數據,低估帶寬限制可能導致減速和擁堵。
示例:未經壓縮的高解析度視頻流可能會壓倒網路資源,導致緩衝和延遲。
- 網路是安全的。您的數據並非因為分佈在多台機器上就不可戰勝。分散式系統提供了更大的攻擊面,安全考慮必須融入設計的基本結構中。
示例:通過不安全的網路傳輸敏感數據可能會導致惡意行為者截獲數據。
- 拓撲不會改變。網路是動態實體,隨著節點的添加、刪除或重新配置而不斷演變。分散式系統需要適應這些變化而不失一步。
示例:配置文件中的固定IP地址可能會導致伺服器移動或重新定址時服務中斷。
- 只有一個管理員。在現實世界中,分散式系統通常跨越許多管理域。理解和協調這些邊界對於順利運行至關重要。
示例:部門之間的不一致的防火牆規則可能會造成安全漏洞或連接問題。
- 傳輸成本為零。然而,通過網路發送數據並不免費。每次跳轉都會產生成本,無論是在時間還是資源上。優化數據傳輸對於高效的分散式系統至關重要。
示例:雲服務中的過多API調用可能會因數據出站費用而增加成本。
- 網路是同質的,不同的網路具有不同的特性。在本地網路上有效的可能在全局互聯網上表現不佳。分散式系統需要靈活且能夠適應多樣化的網路環境。
示例:為高速有線連接優化的應用程式可能在移動網路上表現不佳。
理解這些謬誤是構建可靠的分散式系統的第一步,但也要:
- 設計具有冗餘和容錯能力的系統。
- 建立監控和警報系統。
- 將安全最佳實踐和數據加密放在首位。
- 優化通信協議以提高效率和性能。
- 選擇適合系統特定需求的技術和架構。
雲設計模式
這些設計原則可用於創建可靠、可擴展和安全的雲系統。大多數雲工作負載都容易受到分散式計算謬誤的影響,因此這些模式提高了認識並減輕了它們,包括權衡。我們可以將雲設計模式分為三個一般組。每個模式可以應用於任何分散式系統,無論是在本地托管還是在雲平臺上。
主要的雲設計模式是:
1.數據管理
雲應用的主要組成部分是數據管理,它影響著大多數質量標準。數據托管在許多伺服器和位置,以提高性能、可擴展性或可用性。這可能會帶來幾個困難。例如,通常需要在許多地方之間同步數據以確保數據一致性。
這組中最重要的模式是:
緩存旁路Cache-Aside模式:通過緩存頻繁訪問的數據來提高應用程式性能並減少對數據存儲的負載。
- 場景:從緩存中讀取數據,如果緩存未命中則從資料庫讀取並更新緩存。
- 案例:通過Redis提升資料庫查詢效率。
- 工具鏈:Redis、Memcached。
- 架構評估:適合高頻查詢且數據更新較少的場景。
命令和查詢責任分離(CQRS)模式:分離讀寫操作以優化性能、可擴展性和安全性。
- 場景:分離讀寫操作以提高性能。
- 案例:寫操作更新資料庫,讀操作從緩存獲取數據。
- 工具鏈:EventStore、Axon。
- 架構評估:適合高併發的應用,提供更高的擴展性。
事件溯源Event Sourcing模式:維護應用程式數據的完整變更歷史。
- 場景:通過事件重放恢復系統狀態。
- 案例:交易系統中保存每個交易事件以確保審計和一致性。
- 工具鏈:Kafka、EventStore。
- 架構評估:適合對歷史數據重現有需求的場景。
物化視圖Materialized View模式:通過預計算和存儲複雜查詢的結果來提高查詢性能。
- 場景:預先計算並存儲查詢結果以加速訪問。
- 案例:通過資料庫物化視圖提高複雜查詢的性能。
- 工具鏈:PostgreSQL、MongoDB。
- 架構評估:適用於複雜計算查詢場景,提升系統響應速度
分片Sharding模式:通過跨多個資料庫或伺服器分區數據來擴展數據存儲。
- 場景:將數據水平切分到多個資料庫實例。
- 案例:通過分片將大數據分佈在多個資料庫以提高性能。
- 工具鏈:Cassandra、MongoDB。
- 架構評估:適用於大規模數據存儲,確保數據查詢和存儲的高擴展性
Valet Key代客鑰匙模式:為客戶提供對特定資源的安全、臨時訪問,而不會暴露敏感憑據。
- 場景:為臨時用戶生成短期訪問憑證。
- 案例:用戶上傳文件時,生成限時的S3上傳URL。
- 工具鏈:AWS S3 Pre-Signed URL、Azure SAS Token。
- 架構評估:適用於臨時授權的場景,確保全全性和便捷性。
Index Table(索引表):
- 場景:創建索引表以提高查詢效率。
- 案例:為高頻查詢的資料庫創建專用索引表。
- 工具鏈:Elasticsearch、DynamoDB。
- 架構評估:適合需要快速查詢特定數據的場景。
2.設計和實現
良好的設計包括可維護性,以便於管理和開發,可重用性,允許組件和子系統在不同的應用程式和上下文中使用,以及組件設計和部署的一致性和連貫性。在設計和實現階段所做的決策影響雲托管應用程式和服務的質量和總擁有成本。
這組中最重要的模式是:
絞殺者Strangler Fig模式:通過用新應用程式或服務替換特定部分來逐步遷移遺留系統。
- 場景:逐步用新系統替換舊系統。
- 案例:在不影響現有功能的前提下替換舊的單體架構。
- 工具鏈:Kubernetes、Blue-Green Deployment。
- 架構評估:適合逐步遷移項目,避免大規模重構帶來的風險。
反腐敗層Anti-Corruption Layer模式:當集成具有不同模型或範式的遺留或外部系統時,這種模式保護新系統的完整性。
- 場景:防止不同系統間的模型和數據污染。
- 案例:舊系統與新系統集成時,確保數據一致性和隔離。
- 工具鏈:Apache Camel、Spring Integration。
- 架構評估:適合遷移項目,確保系統之間的邊界清晰。
艙壁Bulkhead模式:通過隔離一個組件中的故障,防止影響其他組件,從而增加系統的彈性。
- 場景:分離關鍵資源,防止故障蔓延。 系統的某些組件或服務出現故障時,希望其他組件能夠繼續正常工作,避免“雪崩效應”。需要將不同服務的資源隔離,以避免一個服務消耗過多資源導致整個系統崩潰。
在一個微服務系統中,假設服務A和服務B都訪問同一個資料庫,可以為每個服務分配獨立的資料庫連接池。即使服務A耗盡了所有連接,服務B仍然可以繼續訪問資料庫。 - 案例:微服務架構中為不同服務設置獨立的資源池。 在高併發場景下,防止某個模塊消耗過多線程或記憶體資源,影響整個系統的運行。
- 工具鏈:Hystrix、Resilience4j,Kubernetes可以為不同服務定義資源限制(如CPU、記憶體),實現隔離艙的概念。
- 架構評估:適用於分散式系統中容災場景,可提升系統的隔離性與彈性。
邊車Sidecar模式:部署一個並行組件來擴展或增強服務的功能,而無需修改其代碼。
- 場景:在微服務旁邊運行的輔助服務,提供額外功能。
- 案例:在Kubernetes中為每個服務運行一個Sidecar容器。
- 工具鏈:Envoy、Istio。
- 架構評估:提高微服務的可觀察性和管理能力。
服務端對前端(Backends for Frontends)模式:涉及創建針對不同客戶端應用程式(例如,Web和移動)需求量身定製的單獨後端服務。
- 場景:為不同前端提供專用的後端服務。
- 案例:移動端與桌面端分別有各自的後端服務。
- 工具鏈:GraphQL、Apollo Server。
- 架構評估:提升前端性能和後端靈活性,適合多端系統。
Ambassador(大使模式):
- 場景:在微服務和外部系統之間創建代理。
- 案例:在微服務和外部資料庫間使用代理處理通信。
- 工具鏈:Envoy、HAProxy。
- 架構評估:增強外部依賴的可擴展性和安全性。
Compute Resource Consolidation(計算資源整合):
- 場景:將多個計算任務整合到一個資源池中。
- 案例:在Kubernetes中整合不同的工作負載以節省成本。
- 工具鏈:Kubernetes、Nomad。
- 架構評估:適合多任務整合的場景,最大化計算資源利用率。
External Configuration Store(外部配置存儲):
- 場景:將配置存儲在外部系統中以支持動態更新。
- 案例:通過Consul或Etcd實現配置的集中管理。
- 工具鏈:Consul、Etcd、Spring Cloud Config。
- 架構評估:適合配置頻繁變動或需要動態更新的場景。
Gateway Aggregation(網關聚合):
- 場景:通過網關聚合多個請求以減少客戶端請求次數。
- 案例:API Gateway聚合多個微服務的響應。
- 工具鏈:Nginx、Kong。
- 架構評估:適用於減少客戶端對多個服務的請求次數,提高性能。
Gateway Offloading(網關卸載):
- 場景:將一些功能(如SSL處理)卸載到網關層。
- 案例:Nginx網關負責SSL終止,減少後端服務壓力。
- 工具鏈:Nginx、AWS API Gateway。
- 架構評估:提高後端性能,減少不必要的處理負載。
Gateway Routing(網關路由):
- 場景:通過網關對不同的服務進行路由。
- 案例:API Gateway根據請求路徑將請求路由到不同服務。
- 工具鏈:Kong、AWS API Gateway。
- 架構評估:適合微服務架構中的請求管理,提升系統靈活性。
Leader Election(領導選舉):
- 場景:在集群中通過選舉選擇一個領導者。
- 案例:Kafka集群中的領導者選舉。
- 工具鏈:Zookeeper、Etcd。
- 架構評估:適用於分散式系統中的高可用性和容錯性。
Static Content Hosting(靜態內容托管):
- 場景:將靜態內容托管在外部服務上,減少後端負載。
- 案例:通過CDN托管靜態網頁內容。
- 工具鏈:AWS S3、Cloudflare。
- 架構評估:提升靜態內容載入速度,減少後端服務壓力。
3.消息傳遞
由於雲應用程式是分散式的,因此需要消息傳遞基礎設施來連接各個部分和服務。這種基礎設施應該是松耦合的,以允許最大的可擴展性。非同步消息傳遞很受歡迎,有許多優點,但也有缺點,如排序消息、管理毒藥消息、冪等性等。
這組中最重要的模式是:
基於隊列的負載均衡Queue-Based Load Leveling模式:通過緩衝傳入請求並確保系統能夠平滑處理負載波動來管理變化的工作負載。
- 場景:通過隊列平衡請求的突發負載。
- 案例:消息隊列處理非同步請求。
- 工具鏈:RabbitMQ、AWS SQS。
- 架構評估:用於緩解高峰負載壓力,提升系統響應能力。
發佈-訂閱模式:使應用程式能夠向多個消費者廣播消息,而不必與它們緊密耦合。
- 場景:通過事件發佈通知多個訂閱者。
- 案例:電商系統中用戶下單後通知多個服務。
- 工具鏈:Kafka、Redis Pub/Sub。
- 架構評估:適合事件驅動的系統,提升系統的擴展性和解耦能力。
競爭消費者模式:通過讓多個消費者併發處理消息來增強可擴展性和吞吐量。
- 場景:多個消費者同時處理消息隊列中的消息,增加吞吐量。
- 案例:多個消費者從同一個Kafka Topic中讀取消息。
- 工具鏈:Kafka、RabbitMQ。
- 架構評估:適合高吞吐的任務處理,確保任務負載在多個實例間分配。
消息代理模式:通過引入處理消息路由、轉換和傳遞的中間件來解耦應用程式。
1)場景:
- 當應用程式中的組件或服務需要通信,但不希望直接相互依賴時。可以通過消息代理作為中間層來傳遞消息。
- 系統需要處理大量非同步任務,或將任務分發給多個消費者時(例如,處理日誌、事件、任務隊列等)。
- 服務間需要通過非同步通信來應對高併發或高吞吐量的場景,避免服務直接調用帶來的性能瓶頸或故障蔓延。
- 系統中可能有多個消息生產者和消費者,需要靈活控制消息流、優先順序、負載均衡等功能。
2)案例:
- 電商訂單系統:當用戶下單後,系統會觸發多種非同步任務(如通知庫存系統減少庫存、通知物流系統發貨、通知用戶服務系統發送確認郵件等)。消息代理可以確保訂單服務通過消息隊列分發任務,而不需要與各服務直接通信。
- 日誌處理系統:應用程式將大量日誌信息非同步發送到消息代理,由多個消費者(如日誌分析服務、監控服務等)來處理和分析日誌信息。
- 銀行支付系統:用戶發起支付請求時,支付服務通過消息代理通知其他系統(如風控、賬戶管理、通知服務等)處理相關事務。消息代理可確保系統間通信的可靠性與非同步處理能力,提升整體系統的可擴展性。
3)工具鏈:
- Apache Kafka:一個分散式的流處理平臺,廣泛用於高吞吐量的實時數據管道、日誌處理、事件驅動架構等場景。它支持持久化和回放消息。
- RabbitMQ:一種輕量級的消息隊列系統,支持多種消息模式(如發佈/訂閱、工作隊列、路由等),適合中小型非同步任務的處理。
- ActiveMQ:Apache基金會的消息代理系統,支持多種協議(如AMQP、MQTT等),常用於傳統企業消息通信系統。
- AWS SQS(Simple Queue Service):Amazon提供的完全托管的消息隊列服務,具有高可用性和可靠性,適合雲環境中的分散式系統。
- Google Pub/Sub:Google雲提供的分散式消息隊列服務,支持大規模實時消息傳遞,適合微服務架構或事件驅動系統。
4)架構評估:
- 松耦合:通過消息代理解耦各個服務,生產者和消費者不直接依賴。它們通過消息代理非同步通信,這提高了系統的靈活性和可擴展性。
- 可靠性增強:消息代理通常支持持久化消息和重試機制,確保消息不會丟失,特別是在網路中斷或服務故障時。
- 可擴展性:消息代理可以支持多個消費者同時處理消息,能夠靈活分配負載,並實現消息的廣播、路由、優先順序等高級功能,適合處理高併發任務。
- 非同步處理能力:Message Broker Pattern允許任務非同步處理,不必等到消費者處理完成,生產者可以繼續執行後續任務。這減少了服務間的等待時間和延遲。
- 性能瓶頸:消息代理的引入會增加額外的延遲和性能開銷,尤其是在高併發的情況下,如果沒有適當的容量規劃,消息代理本身可能成為系統的瓶頸。
- 複雜性增加:引入消息代理需要額外的基礎設施、配置和管理,尤其是在使用分散式的消息代理(如Kafka)時,需要考慮分區、複製、恢復等機制。
管道和過濾器模式:通過一系列處理組件(過濾器)處理數據,這些組件通過通道(管道)連接。
1)場景:
- 系統需要處理複雜的、多步驟的數據流操作時,如數據轉換、清洗、增強、過濾等。
- 系統中存在需要重覆使用的處理步驟,可以通過過濾器來模塊化,提升可維護性和靈活性。
- 數據處理需要可擴展,可以在不影響其他步驟的情況下增加或修改某一階段的處理邏輯。
- 需要並行處理數據流,提高性能和處理效率。
2)案例:
- 數據處理管道:在ETL(Extract, Transform, Load)流程中,數據從多個源提取後,需要經過一系列的轉換(過濾、清洗、轉換格式、聚合等)才能載入到目標資料庫。每個數據轉換步驟可以作為一個過濾器,數據通過管道在過濾器之間流動。
- 日誌處理系統:當日誌從應用程式生成後,可以通過管道傳遞給多個過濾器來進行處理:格式化、篩選特定日誌級別、添加時間戳等,最後輸出到存儲系統或監控平臺。
- 媒體文件處理:在處理媒體文件(如圖像或視頻)時,可以通過多個過濾器依次執行各種操作:調整大小、格式轉換、水印添加、壓縮等,每個操作都是一個獨立的過濾器,管道將文件從一個處理步驟傳輸到下一個。
- 微服務鏈式處理:多個微服務依次處理同一條請求或任務時,每個微服務執行一個處理步驟,並將處理結果傳遞給下一個微服務。這種方式也可被視為一種管道與過濾器的實現。
3)工具鏈:
- Apache Camel:一個基於EIP(Enterprise Integration Patterns)的集成框架,允許定義靈活的數據處理和傳輸管道,可以將多個步驟通過過濾器模式進行串聯。
- Spring Integration:Spring框架的擴展模塊,提供消息處理、文件處理、數據轉換等功能,可以輕鬆實現管道與過濾器模式。
- Apache NiFi:一個數據流自動化和管理工具,專註於數據的捕獲、轉換、路由等操作,可以將多個過濾器進行管道化處理。
- Logstash:ELK(Elasticsearch、Logstash、Kibana)棧中的數據處理工具,允許通過多個過濾器對日誌進行處理,並通過管道將日誌傳遞到不同的存儲或分析系統。
- Kubernetes Sidecar Containers:在微服務架構中,Sidecar容器可以用於在數據流經過不同服務時對其進行處理、過濾或增強,作為管道與過濾器模式的實現之一。
4)架構評估:
- 模塊化與可重用性:每個過濾器執行一個獨立的功能,且可以被其他管道重覆使用,提高了代碼和邏輯的可重用性和可維護性。
- 靈活性:可以在不影響整體管道的情況下,隨時增加、刪除或修改某個過濾器,提升了系統的靈活性。例如,處理數據流時,可以輕鬆加入新的步驟,而無需改變整個系統架構。
- 可擴展性:通過將數據流分解為多個獨立的步驟,可以通過並行處理提升系統性能,尤其是在處理大規模數據或高併發場景中。
- 性能考量:雖然模式可以並行處理和模塊化,但是如果某個過濾器處理速度慢,可能成為瓶頸,阻礙數據流的效率。需確保管道的每個階段都高效執行,避免系統性能瓶頸。
- 調試與監控:管道化的數據處理在調試時可能較為複雜,需要額外的日誌、監控和可視化工具來追蹤數據在不同過濾器之間的流動情況。
Scheduler Agent Supervisor(調度代理監控):
- 場景:協調多個作業的調度和執行。
- 案例:定時作業和批處理任務的監控和管理。
- 工具鏈:Celery、Kubernetes Cron Jobs。
- 架構評估:用於批處理和調度密集型應用的管理。
Choreography(編排):
- 場景:通過事件觸發機制處理複雜的業務邏輯。
- 案例:電商系統中訂單、庫存和支付服務的協作。
- 工具鏈:Apache Kafka、EventBridge。
- 架構評估:複雜的微服務體繫結構,適合無中心控制器的分散式工作流。
Claim Check(認領檢查):
- 場景:在消息中只傳遞指向大型數據的引用,減少消息體積。
- 案例:消息傳遞時將大數據存儲到外部存儲服務中。
- 工具鏈:S3、Kafka。
- 架構評估:適合需要傳輸大數據但又希望控制消息大小的場景。
Priority Queue(優先順序隊列):
- 場景:根據優先順序處理消息,確保關鍵任務優先執行。
- 案例:支付系統中高優先順序交易優先處理。
- 工具鏈:RabbitMQ、ActiveMQ。
- 架構評估:適用於對消息處理順序有明確優先順序需求的業務場景。
Async Request-Reply(非同步請求-回覆):
- 場景:通過非同步消息處理請求與回覆。
- 案例:使用消息隊列進行任務分發。
- 工具鏈:Kafka、RabbitMQ。
- 架構評估:用於松耦合的微服務通信,減輕服務壓力。
Choreography(編排):
- 場景:通過事件觸發機制處理複雜的業務邏輯。
- 案例:電商系統中訂單、庫存和支付服務的協作。
- 工具鏈:Apache Kafka、EventBridge。
- 架構評估:複雜的微服務體繫結構,適合無中心控制器的分散式工作流。
4.安全性
安全性保護信息系統免受敵對攻擊,確保數據的機密性、完整性和可用性。失去這些保證可能會損害公司的運營、收入和市場聲譽。遵循公認的程式並保持警惕以發現和解決漏洞和活躍威脅對於維護安全至關重要。
這組中最重要的模式是:
門禁模式:通過驗證和清理請求,通過充當門衛的專用主機來保護後端服務。
- 場景:對資源訪問進行細粒度的控制和驗證。
- 案例:API Gateway中的訪問控制。
- 工具鏈:Kong Gateway、AWS API Gateway。
- 架構評估:對公共和敏感資源的訪問管理非常重要,適合分散式系統中的訪問控制策略。
聯合身份模式:通過允許用戶使用來自受信任身份提供商的現有憑據登錄來簡化用戶認證。
- 場景:用戶通過單點登錄(SSO)在多個系統中進行身份驗證。
- 案例:OAuth 2.0、OpenID Connect。
- 工具鏈:AWS Cognito、Okta、Auth0。
- 架構評估:適合需要跨多個服務共用認證的架構,能夠減少重覆登錄。
密鑰存儲模式:安全地管理敏感配置數據,如密碼、API密鑰和連接字元串。
1)場景:
- 當應用程式需要存儲和使用敏感信息,如資料庫憑據、API密鑰、SSH密鑰等時。
- 應用程式或服務之間共用機密數據時,確保這些數據在網路傳輸或存儲過程中不被泄露。
- 應用部署在多雲或多環境(如開發、測試、生產)中,需要中央管理的機密信息。
- 需要在不修改代碼的情況下更新或輪換這些敏感數據。
2)案例:
- CI/CD流水線中的機密管理:在持續集成/持續部署流水線中,工具需要訪問敏感信息(如雲提供商的訪問密鑰),但不應將這些信息硬編碼到腳本或配置文件中。
- 微服務架構中的機密管理:多個微服務需要訪問資料庫或外部API,每個服務應通過安全機制訪問這些敏感信息,而不是將憑據保存在配置文件中。
- 伺服器上證書的安全輪換:Web伺服器需要周期性地輪換SSL/TLS證書,以避免證書過期或遭到濫用。
3)工具鏈:
- HashiCorp Vault:一個廣泛使用的機密管理工具,支持動態憑據、加密存儲以及訪問控制。
- AWS Secrets Manager:專為AWS環境設計的機密管理服務,自動輪換、加密存儲密鑰並控制訪問許可權。
- Azure Key Vault:Azure雲平臺中的機密存儲服務,專註於管理密鑰、機密、證書和硬體安全模塊(HSM)保護的密鑰。
- Kubernetes Secrets:Kubernetes原生的機密管理機制,用於存儲敏感數據,並將其作為環境變數或捲註入到容器中。
- Google Cloud Secret Manager:Google雲平臺的機密管理服務,允許應用程式集中存儲和訪問敏感信息。
- CyberArk Conjur:面向企業環境的機密管理平臺,支持動態憑據生成和細粒度的訪問控制。
4)架構評估:
- 安全性提升:通過集中化存儲和加密管理,極大提高了敏感信息的安全性,防止泄漏或濫用。特別是工具支持審計和訪問控制,可以追蹤誰訪問了哪些機密信息。
- 易於管理和輪換:Secret Store Pattern支持動態密鑰生成和自動密鑰輪換,減少了手動管理的複雜度和潛在的安全風險。
- 減少代碼暴露風險:敏感信息不再需要硬編碼到配置文件或代碼中,降低了代碼泄漏時的風險,特別是在開源項目中。
- 擴展性和靈活性:這種模式在多環境、多服務之間具有良好的擴展性和靈活性,可以通過API訪問、CLI工具、自動化工具進行管理,支持高可用的分散式應用場景。
- 可操作性挑戰:如果配置不當,可能導緻密鑰無法正常輪換或過期密鑰影響生產環境運行。因此,需要設置監控和告警機制。
驗證模式:通過確保所有輸入數據在處理之前都經過驗證和清理來保護應用程式。
1)場景:
- 當用戶輸入的數據需要嚴格符合業務規則和格式要求時,如表單輸入、API請求參數等。
- 在系統中不同層次(前端、後端、資料庫)對數據的有效性進行驗證,避免錯誤數據進入核心邏輯或存儲。
- 防止惡意輸入,如SQL註入、XSS攻擊等,通過驗證模式保證輸入的安全性。
- 在微服務之間的通信或系統集成時,確保數據交換的有效性。
2)案例:
- 表單數據驗證:用戶在前端提交表單時,驗證模式可以確保用戶輸入的郵箱、電話、密碼等符合特定格式,併在前端或後端給出即時反饋。
- API請求數據驗證:在接收第三方系統的API請求時,驗證模式可以檢查傳入的JSON、XML等數據結構是否合法,並拒絕不符合要求的數據。
- 資料庫層驗證:通過資料庫的約束(如唯一性、非空、外鍵等)進一步確保存儲數據的有效性,防止無效數據進入資料庫。
- 服務間通信驗證:微服務之間的消息傳遞需要驗證消息的格式、數據類型和欄位值,以避免數據傳輸中的錯誤導致系統故障。
3)工具鏈:
- 前端驗證庫:
- React Hook Form:React的輕量級表單驗證庫,支持表單狀態管理與校驗。
- Formik:另一個流行的React表單管理和驗證庫。
- VeeValidate:Vue.js應用中使用的表單驗證庫。
- 後端驗證庫:
- Spring Validation:Spring框架內置的驗證功能,基於註解方式,可以對Java對象進行自動驗證。
- Hibernate Validator:Java中廣泛使用的驗證框架,支持Bean Validation規範。
- Express-validator:Node.js中用於Express框架的驗證庫。
- API網關:
- Kong:可以在API請求進入系統前,對請求的數據結構和參數進行驗證。
- AWS API Gateway:支持對請求參數進行格式和內容驗證,減少無效請求的處理。
4)架構評估:
- 安全性提升:通過驗證模式,系統能夠在早期階段過濾掉惡意或無效數據,減少SQL註入、跨站腳本攻擊等安全風險。
- 數據完整性保證:在系統的不同層級實現驗證(如前端、後端、資料庫等),能保證進入系統的數據符合業務規則,避免錯誤數據帶來的業務問題。
- 性能考量:儘量在前端或網關層執行初步驗證,可以減少系統後端的負載。後端和資料庫層的驗證應作為防禦的最後一道關卡。
- 用戶體驗:在前端提供即時的驗證反饋能提升用戶體驗,減少因為提交無效數據而產生的困惑或重覆操作。
- 維護成本:如果不同層級(前端、後端、資料庫)都實現了數據驗證,確保驗證規則的一致性和維護難度可能較大,尤其在驗證邏輯複雜時需要確保驗證規則不重覆、不衝突。
5.可靠性
當我們談論可靠性時,我們通常指的是系統的可用性和彈性。系統運行和操作的時間百分比稱為可用性,以正常運行時間的百分比表示。相比之下,系統的彈性是其處理和從故意和非故意故障中恢復的能力。
這組中最重要的模式是:
重試Retry模式:通過自動重試失敗的操作來處理瞬時故障,以增加成功的機會。
- 場景:針對失敗的操作進行自動重試。
- 案例:請求超時時重新嘗試通信。
- 工具鏈:Resilience4j、Exponential Backoff演算法。
- 架構評估:可用於短暫故障的恢復,提高系統的健壯性。
斷路器Circuit Breaker模式:這種模式防止應用程式重覆嘗試可能失敗的操作,保護系統資源並提高穩定性。
- 場景:保護服務免於過載,通過熔斷防止級聯故障。
- 案例:請求失敗過多時中斷通信。 某個微服務依賴一個第三方API,API偶爾會宕機或變慢。在API不可用時,Circuit Breaker打開,拒絕進一步調用,防止系統線程被掛起。
- 熔斷器三種狀態:
- Closed(關閉狀態):正常工作,所有請求正常通過。
- Open(打開狀態):當外部服務故障或響應時間超過設定閾值時,熔斷器會進入打開狀態,直接拒絕請求,防止資源耗盡。
- Half-Open(半開狀態):在等待一段時間後,熔斷器進入半開狀態,允許少量請求通過。如果這些請求成功,熔斷器恢復到關閉狀態;否則,熔斷器重新打開。
- 當依賴服務恢復正常後,系統將逐漸允許更多請求,直至恢復正常狀態。
- 工具鏈:Hystrix、Resilience4j。
- 架構評估:適用於高併發服務,減少系統級故障的風險。
工作原理:
節流Throttling模式:通過限制應用程式處理請求的速率來控制資源消耗。
- 場景:限制請求速率,防止系統過載。
- 案例:API Gateway中的速率限制。
- 工具鏈:Nginx、Kong、AWS API Gateway。
- 架構評估:適合防止DDoS攻擊和惡意請求高峰。
健康端點監控Health Endpoint Monitoring模式:通過公開監控工具可以訪問的健康檢查端點來主動檢測系統故障。
- 場景:監控系統健康狀況,自動恢復故障。
- 案例:通過API健康檢查自動檢測服務狀態。
- 工具鏈:Prometheus、Grafana。
- 架構評估:為自動化監控和故障恢復提供關鍵支持。
Compensating Transaction(補償事務):
- 場景:用於長事務或分散式事務的補償機制。
- 案例:訂單取消時,補償回滾之前的相關操作。
- 工具鏈:Saga、Apache Camel。
- 架構評估:適用於跨多個微服務的事務一致性管理。
Deployment Stamps(部署標記):
- 場景:分離部署環境以提高系統可靠性。
- 案例:同一服務在不同區域部署以確保可用性。
- 工具鏈:Kubernetes、Terraform。
- 架構評估:對於全球分佈的服務,確保多區域故障的容錯性。
Geodes(地質模式)是一種分散式緩存模式:
用於解決大規模分散式系統中數據存取性能和一致性問題。該模式的核心思想是通過在多個地理位置部署緩存層,減少對遠程數據源的訪問,從而提升性能並降低網路延遲。
1)場景:
- 全球分佈的用戶訪問:當應用程式的用戶遍佈全球,不同地區的用戶訪問數據源時可能會受到網路延遲的影響。Geodes模式通過在每個地理位置部署緩存,使得用戶可以訪問距離最近的數據副本,從而減少訪問延遲。
- 高可用性需求:當系統需要在不同地理位置實現高可用性和災難恢復時,可以在多個位置保持數據的緩存副本,確保某個地區的緩存失效時,用戶還能從其他地區獲取數據。
- 高併發場景:在需要處理大量併發請求的系統中,通過分散式緩存減少對原始數據源(如資料庫)的直接訪問,從而減輕後端數據源的負載,提升系統的吞吐量。
- 讀多寫少的系統:如果系統的讀操作遠多於寫操作,Geodes模式可以通過緩存加速讀操作,而不頻繁訪問原始數據源。
2)案例:
- 全球電商平臺:用戶在全球各地購物時,為了提升用戶體驗,需要減少用戶請求到後端資料庫的時間。在全球多個數據中心部署緩存,用戶可以就近訪問商品、庫存、價格等數據,減少對主資料庫的訪問,提升響應速度。
- 內容分髮網絡(CDN):內容分髮網絡的緩存機制本質上就是Geodes模式的一個應用案例。CDN將靜態資源(如圖像、視頻等)緩存到全球各地的伺服器節點,用戶請求時可以從最近的節點獲取資源,降低延遲和帶寬消耗。
- 金融交易系統:對於需要跨多個地區進行金融交易的系統來說,延遲是一個關鍵因素。通過在每個地區部署緩存,Geodes模式可以確保交易數據、用戶信息等快速訪問,提升交易的實時性和準確性。
- 社交媒體平臺:全球用戶同時訪問平臺上的熱門內容(如視頻、圖片、帖子等),通過地理位置緩存來減少對主伺服器的負載,提升用戶的訪問速度和系統的穩定性。
3) 工具鏈:
- Redis:一個高性能的分散式記憶體緩存系統,支持主從架構以及跨地域複製,常用於實現分散式緩存和加速讀操作。
- Memcached:另一個分散式緩存系統,適合高頻讀寫場景,雖然不支持持久化和複製,但在全球分散式緩存場景中也有應用。
- Amazon ElastiCache:AWS的托管緩存服務,支持Redis和Memcached,能夠部署在多個AWS區域,用於地理分散式緩存和高可用場景。
- Azure Cache for Redis:Microsoft Azure的托管緩存服務,支持跨區域分佈,適合在多地域的應用場景中使用。
- Google Cloud Memorystore:Google雲平臺提供的緩存服務,支持Redis和Memcached,可以結合全球分佈的Google Cloud區域實現地理分佈的緩存。
4)架構評估:
- 性能提升:通過將數據緩存到離用戶最近的地理位置,顯著減少請求延遲,提升系統的整體性能。特別是對於全球用戶分佈的系統,能夠有效提升用戶體驗。
- 高可用性:多個地理位置的緩存副本可以確保系統在某個區域故障時仍能從其他區域獲取數據,提高了系統的容錯能力和可用性。
- 一致性問題:緩存中的數據可能會與主數據源不同步,因此需要採取措施確保數據的一致性(如設置TTL(時間到期)或使用緩存更新策略)。
- 複雜性增加:分散式緩存引入了數據複製、同步、緩存失效等複雜問題,尤其是涉及多個地理區域時,需要設計合理的數據一致性和更新策略。
- 成本評估:緩存的存儲和跨地域複製會增加運營成本,尤其是在使用托管緩存服務時,需要評估成本和性能的權衡。
Azure中的負載均衡
確保應用程式能夠處理高流量並始終保持可用是至關重要的。負載均衡是實現這一目標的重要策略,Azure提供了針對不同需求量身定製的幾個健壯的負載均衡解決方案。瞭解Azure的負載均衡選項可以幫助您設計可擴展和彈性架構,無論您是在開發簡單的雲應用程式還是複雜的系統。
用於負載均衡的主要Azure服務有:
Azure Front Door:一個全局負載均衡器,在第7層(HTTP/HTTPS)提供應用程式加速和全局負載均衡。它基於性能優化路由,並可以處理SSL卸載。
Azure Traffic Manager:基於dns的流量負載均衡器,可跨多個區域分配流量。它支持各種路由方法,如基於地理、性能和優先順序的路由,確保將用戶定向到最合適的區域端點。
Azure Load Balancer:第4層負載均衡器在一個區域的虛擬機(vm)之間分配流量。它支持入站和出站場景,為區域部署提供高可用性和低延遲。
Azure Application Gateway:是一個第7層負載均衡器,具有高級路由功能、SSL終端和Web應用防火牆(WAF)。它是為需要區域負載平衡的web應用程式量身定製的。
總結
學習雲設計模式對於開發者、架構師以及任何在雲計算環境中工作的專業人員來說,具有深遠的意義。隨著雲計算技術的不斷發展和普及,傳統的軟體開發和部署方式已經發生了翻天覆地的變化。雲設計模式作為在雲計算背景下產生的一系列最佳實踐和設計原則,旨在幫助開發者更高效地構建、部署和管理雲原生應用。
今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管理,信息安全,團隊建設 有參考作用 , 您可能感興趣的文章:
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
視頻直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續集成/CD
互聯網電商購物車架構演變案例
互聯網業務場景下消息隊列架構
互聯網高效研發團隊管理演進之一
消息系統架構設計演進
互聯網電商搜索架構演化之一
企業信息化與軟體工程的迷思
企業項目化管理介紹
軟體項目成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共用
高效能的團隊建設
項目管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
互聯網資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之性能實時度量系統演變
如有想瞭解更多軟體設計與架構, 系統IT,企業信息化, 團隊管理 資訊,請關註我的微信訂閱號:
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發佈在我的獨立博客中-Petter Liu Blog。