微服務架構下的 9 大經典隔離策略
01
前言
單體應用中,一個組件的故障往往會拖垮整個系統。而微服務架構的一個好處便在於更好的容錯性——微服務之間可以實現更好的故障隔離,單個服務內的內存泄露等故障不容易影響其他服務。
但微服務架構由於服務數變多也帶來了複雜度的問題,由此引來了經典的服務治理問題,這也是許多程序員走上架構師方向的必由之路。微服務中的隔離策略,便是其中的關鍵,本文將詳解 9 大隔離策略的具體做法,爲你的系統可用性添磚加瓦。
02
隔離
微服務系統中,隔離策略是流量治理的關鍵組成部分,其主要目的是避免單個服務的故障引發整個系統的連鎖反應。
通過隔離,系統能夠局部化問題,確保單個服務的問題不會影響到其他服務,從而維護整體系統的穩定性和可靠性。
常見的隔離策略:
03
動靜隔離
動靜隔離通常是指將系統的動態內容和靜態內容分開處理
動態內容
-
指需要實時計算或從數據庫中檢索的數據,通常由後端服務提供;
-
可以通過緩存、數據庫優化等方法來提高動態內容的處理速度。
靜態內容
-
指可以直接從文件系統中獲取的數據,例如圖片、音視頻、前端的 CSS、JS 文件等靜態資源;
-
可以存儲到 OSS 並通過 CDN 進行訪問加速。
04
讀寫隔離
讀寫隔離通常是指將讀操作和寫操作分離到不同的服務或實例中處理
-
大部分的系統裏讀寫操作都是不均衡的,寫數據可能遠遠少於讀數據;
-
讀寫隔離得以讓讀服務和寫服務獨立擴展。
DDD 中有一種常用的模式:CQRS(Command Query Responsibility Segregation,命令查詢職責分離)來實現讀寫隔離
寫服務
-
負責處理所有的寫操作,例如創建、更新和刪除數據;
-
通常會有一個或多個數據庫或數據存儲,用於保存系統的數據。
讀服務
-
負責處理所有的讀操作,例如查詢和檢索數據;
-
可以有獨立的數據庫或數據存儲,也可以使用緩存來提高查詢的性能。
事件驅動
-
當寫服務處理完一個寫操作後,通常會發佈一個事件,通知讀服務數據已經發生變化;
-
讀服務可以監聽這些事件,並更新其數據庫或緩存,以保證數據的一致性。
獨立擴展
-
通過 CQRS 模式,讀服務和寫服務可以獨立地進行擴展;
-
如果系統的讀負載較高,可以增加讀服務的實例數量;如果寫負載較高,可以增加寫服務的實例數量。
05
核心隔離
核心隔離通常是指將資源按照 “核心業務”與 “非核心業務”進行劃分,優先保障 “核心業務” 的穩定運行 AI 助手
-
核心 / 非核心故障域的差異隔離(機器資源、依賴資源);
-
核心業務可以搭建多集羣通過冗餘資源來提升吞吐和容災能力;
-
按照服務的核心程度進行分級。
-
1 級:系統中最關鍵的服務,如果出現故障會導致用戶或業務產生重大損失;
-
2 級:對於業務非常重要,如果出現故障會導致用戶體驗受到影響,但不會導致系統完全無法使用;
-
3 級:會對用戶造成較小的影響,不容易注意或很難發現;
-
4 級:即使失敗,也不會對用戶體驗造成影響。
06
熱點隔離
熱點隔離通常是指一種針對高頻訪問數據(熱點數據)的隔離策略
-
可以幫助微服務系統更高效地處理熱點數據的訪問請求;
-
需要有機制來識別和監控熱點數據;
-
分析系統的歷史訪問記錄;
-
觀察系統的監控告警信息等。
-
將訪問頻次最高的 Top K 數據緩存起來,可以顯著減少對後端存儲服務的訪問壓力,同時提高數據訪問的速度;
-
可以創建一個獨立的緩存服務來存儲和管理熱點數據,實現熱點數據的隔離。
07
用戶隔離
用戶隔離通常是指按照不同的分組形成不同的服務實例。這樣某個服務實例宕機了也只會影響對應分組的用戶,而不會影響全部用戶
基於 O2-SAAS 系統的租戶概念,按照隔離級別的從高到低有如下幾種隔離方式:
- 每個租戶有獨立的服務與數據庫
網關根據 tenant_id 識別出對應的服務實例進行轉發
- 每個租戶有共享的服務與獨立的數據庫
用戶服務根據 tenant_id 確定操作哪一個數據庫
- 每個租戶有共享的服務與數據庫
用戶服務根據 tenant_id 確定操作數據庫的哪一行記錄
08
進程隔離
進程隔離通常是指系統中每一個進程擁有獨立的地址空間,提供操作系統級別的保護區。一個進程出現問題不會影響其他進程的正常運行,一個應用出錯也不會對其他應用產生副作用
容器化部署便是進程隔離的最佳實踐:
09
線程隔離
線程隔離通常是指線程池的隔離,在應用系統內部,將不同請求分類發送給不同的線程池,當某個服務出現故障時,可以根據預先設定的熔斷策略阻斷線程的繼續執行
-
如圖,接口 A 和 接口 B 共用相同的線程池,當 接口 A 的訪問量激增時,接口 C 的處理效率就會被影響,進而可能產生雪崩效應;
-
使用線程隔離機制,可以將 接口 A 和 接口 B 做一個很好的隔離。
10
集羣隔離
集羣隔離通常是指將某些服務單獨部署成集羣,或對於某些服務進行分組集羣管理
具體來說就是每個服務都獨立成一個系統,繼續拆分模塊,將功能微服務化:
11
機房隔離
機房隔離通常是指在不同的機房或數據中心部署和運行服務,實現物理層面的隔離
機房隔離的主要目的有兩個:
-
解決數據容量大、計算和 I/O 密集度高的問題。將不同區域的用戶隔離到不同的地區,比如將湖北的數據存儲在湖北的服務器,浙江的數據存儲在浙江的服務器,這種區域化的數據管理能有效地分散流量和系統負載;
-
增強數據安全性和災難恢復能力。通過在不同地理位置建立服務的完整副本(包括計算服務和數據存儲),系統可以實現異地多活或冷備份。這樣,即使一個機房因自然災害或其他緊急情況受損,其他機房仍能維持服務,確保數據安全和業務連續性。
原創作者丨孔奕凱
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/UDCNe9ihR580TSMQ_RM07Q