微服務架構下的 9 大經典隔離策略

01

前言

單體應用中,一個組件的故障往往會拖垮整個系統。而微服務架構的一個好處便在於更好的容錯性——微服務之間可以實現更好的故障隔離,單個服務內的內存泄露等故障不容易影響其他服務。

但微服務架構由於服務數變多也帶來了複雜度的問題,由此引來了經典的服務治理問題,這也是許多程序員走上架構師方向的必由之路。微服務中的隔離策略,便是其中的關鍵,本文將詳解 9 大隔離策略的具體做法,爲你的系統可用性添磚加瓦。

02

隔離

微服務系統中,隔離策略是流量治理的關鍵組成部分,其主要目的是避免單個服務的故障引發整個系統的連鎖反應。

通過隔離,系統能夠局部化問題,確保單個服務的問題不會影響到其他服務,從而維護整體系統的穩定性和可靠性。

常見的隔離策略:

03

動靜隔離

動靜隔離通常是指將系統的動態內容和靜態內容分開處理

動態內容

靜態內容

04

讀寫隔離

讀寫隔離通常是指將讀操作和寫操作分離到不同的服務或實例中處理

DDD 中有一種常用的模式:CQRS(Command Query Responsibility Segregation,命令查詢職責分離)來實現讀寫隔離

寫服務

讀服務

事件驅動

獨立擴展

05

核心隔離

核心隔離通常是指將資源按照 “核心業務”與 “非核心業務”進行劃分,優先保障 “核心業務” 的穩定運行 AI 助手

06

熱點隔離

熱點隔離通常是指一種針對高頻訪問數據(熱點數據)的隔離策略

07

用戶隔離

用戶隔離通常是指按照不同的分組形成不同的服務實例。這樣某個服務實例宕機了也只會影響對應分組的用戶,而不會影響全部用戶

基於 O2-SAAS 系統的租戶概念,按照隔離級別的從高到低有如下幾種隔離方式:

  1. 每個租戶有獨立的服務與數據庫
    網關根據 tenant_id 識別出對應的服務實例進行轉發

  1. 每個租戶有共享的服務與獨立的數據庫
    用戶服務根據 tenant_id 確定操作哪一個數據庫

  1. 每個租戶有共享的服務與數據庫
    用戶服務根據 tenant_id 確定操作數據庫的哪一行記錄

08

進程隔離

進程隔離通常是指系統中每一個進程擁有獨立的地址空間,提供操作系統級別的保護區。一個進程出現問題不會影響其他進程的正常運行,一個應用出錯也不會對其他應用產生副作用

容器化部署便是進程隔離的最佳實踐:

09

線程隔離

線程隔離通常是指線程池的隔離,在應用系統內部,將不同請求分類發送給不同的線程池,當某個服務出現故障時,可以根據預先設定的熔斷策略阻斷線程的繼續執行

10

集羣隔離

集羣隔離通常是指將某些服務單獨部署成集羣,或對於某些服務進行分組集羣管理

具體來說就是每個服務都獨立成一個系統,繼續拆分模塊,將功能微服務化:

11

機房隔離

機房隔離通常是指在不同的機房或數據中心部署和運行服務,實現物理層面的隔離

機房隔離的主要目的有兩個:

  1. 解決數據容量大、計算和 I/O 密集度高的問題。將不同區域的用戶隔離到不同的地區,比如將湖北的數據存儲在湖北的服務器,浙江的數據存儲在浙江的服務器,這種區域化的數據管理能有效地分散流量和系統負載;

  2. 增強數據安全性和災難恢復能力。通過在不同地理位置建立服務的完整副本(包括計算服務和數據存儲),系統可以實現異地多活或冷備份。這樣,即使一個機房因自然災害或其他緊急情況受損,其他機房仍能維持服務,確保數據安全和業務連續性。

原創作者丨孔奕凱

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UDCNe9ihR580TSMQ_RM07Q