博客 / 詳情

返回

分佈式系統架構4:容錯設計模式

這是小卷對分佈式系統架構學習的第4篇文章,雖然知道大家都不喜歡看純技術文章,寫了也沒多少閲讀量,但是為了個人要成長,小卷最近每天都會更新分佈式的文章

1.概念

容錯策略,指的是“面對故障,我們該做些什麼”;而容錯設計模式,指的是“要實現某種容錯策略,我們該如何去做”。

上一篇已經講了7種容錯策略,為了實現各種策略,開發總結了一些容錯設計模式,包括微服務常見的:斷路器模式、艙壁隔離模式、超時重試模式。

2.斷路器模式

概念:借鑑了電路中的斷路器工作原理,用於防止一個子系統的故障蔓延到整個系統。通過在服務之間增加一個斷路器機制,當服務調用頻繁失敗時,斷路器會切換到OPEN狀態,拒絕進一步調用,避免浪費資源。並且斷路器會定期嘗試重連目標服務,如果服務恢復正常,則恢復調用。

斷路器本質是一種快速失敗策略的實現方式

工作原理

斷路器有三種狀態:

  • 關閉狀態 (Closed):斷路器關閉,請求正常調用。如果調用失敗次數超過設定閾值,斷路器會切換到打開狀態。
  • 打開狀態 (Open):阻斷調用請求,直接返回失敗。此狀態下,系統不會繼續調用目標服務,避免資源浪費。
  • 半開狀態 (Half-Open):是一種中間狀態,斷路器需要帶有自動故障恢復功能,進入OPEN狀態一段時間後,斷路器會嘗試放行一次請求測試服務是否恢復。如果成功,切換回關閉狀態;否則,保持打開狀態。

示例:

Netflix Hystrix可以設置一段時間內請求故障率達到閾值(10秒內20個請求,失敗率50%),斷路器的狀態就會變為OPEN

3.艙壁隔離模式(服務隔離)

概念:靈感來源於船舶設計,通過為每個模塊或服務分配獨立的資源池,防止一個模塊的故障或資源耗盡影響整個系統。其核心思想是“隔離問題”。簡而言之就是:避免某一個遠程服務的局部失敗影響到全局

具體場景

主流的網絡訪問大多是基於 TPR 併發模型(Thread per Request)來實現的,只要請求一直不結束(無論是以成功結束還是以失敗結束),就要一直佔用着某個線程不能釋放。

比如:“服務 I”發生了超時,假設平均 1 秒鐘內會調用這個服務 50 次,就意味着該服務如果長時間不結束的話,每秒會有 50 條用户線程被阻塞。

Tomcat默認HTTP超時時間是20秒,20秒內會阻塞1000條用户線程,而java應用的線程池通常最大設置為200~400,且Java本身是將線程映射為操作系統內核線程來實現的語言環境。這就意味着從外部看,服務已經全面癱瘓了。不僅是服務1,而是整個Tomcat服務。

工作原理

解決辦法就是為每個服務設立單獨的線程池,這樣服務1即使阻塞了,比如阻塞5條用户線程,也不影響全局。

應用案例:阿里內部RPC中間件的HSF線程池隔離

適用場景:系統中存在多個高併發調用的服務,需根據用户等級、用户VIP、用户來訪區域等因素隔離到不同的服務實例的場景。

4.重試模式

概念:適用於解決系統的瞬間故障,如:網絡抖動、服務臨時過載問題。通過設定調用超時時間和重試次數,在調用失敗後自動重試,提升服務調用成功率。

使用重試模式時,實現很簡單,需避免濫用,適用場景的條件:

  • 只在主路關鍵服務上進行同步重試
  • 僅瞬間故障引起的失敗進行重試
  • 僅對冪等性服務進行重試
  • 重試需要有明確終止條件

5.容錯設計模式對比

模式 優點 缺點 適用場景
斷路器模式 防止服務雪崩,保護系統穩定性 服務恢復檢測需要額外開銷 服務調用失敗率高,可能影響全局性能的場景
艙壁隔離模式 故障隔離,防止系統資源被耗盡 增加系統設計複雜性 多模塊、多服務共享資源的場景
重試模式 提高服務調用成功率,適應短期故障 可能增加系統負載,不適合高實時性場景 臨時網絡波動、偶發性調用失敗

其他問題

1. 服務熔斷和服務降級之間的聯繫與差別?

服務熔斷:一種保護機制,用於防止一個服務的連續失敗導致整個系統的崩潰,屬於一種快速失敗的容錯策略的實現方法。當失敗率達到一定閾值時,斷路器會“熔斷”請求,直接返回錯誤響應或默認值

服務降級:通過降低非核心服務的優先級、簡化服務邏輯或直接返回備用響應,保證核心服務和主要業務功能的穩定性。通常是基於業務優先級主動觸發的

維度 服務熔斷 服務降級
觸發方式 被動觸發:根據失敗率、超時或異常次數達到閾值後觸發 主動觸發:根據系統壓力、業務優先級或異常情況手動觸發
作用範圍 面向單個服務的調用鏈,避免單點問題影響全局 面向全局系統,通過調整業務優先級釋放資源
目標 保護目標服務及調用方的資源,避免雪崩效應 保護核心服務的穩定性,儘量降低對用户的影響
恢復機制 自動恢復:斷路器從打開到半開,再到關閉狀態逐步恢復 手動恢復:根據系統壓力或異常消失後調整業務優先級
實現複雜度 需要監控調用失敗率、超時等數據並動態調整 需要結合業務場景設計具體的降級策略
典型場景 下游服務超時、故障,調用方通過熔斷保護自己 高併發、大流量或下游服務不可用時主動釋放資源
user avatar chazhoudeqingchun 頭像 mo_or 頭像 deltaf 頭像 pudongping 頭像 nian_5aedc008c1353 頭像 tracy_5cb7dfc1f3f67 頭像 zilliz 頭像 91cyz 頭像 jianhuan 頭像 luoshenshen 頭像 mylxsw 頭像 dadegongjian 頭像
23 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.