電路斷路器和退化
Circuit Breaker(CB)是一種保護模式,可中斷對降級依賴性的調用,以本地化故障並保護apstream服務和用戶。降解(graceful degradation)-在資源不足或出現故障(例如,返回緩存/不完整數據、禁用「昂貴」信息)的情況下,有意識地簡化功能,而無需完全集中。
主要目標是通過控制故障而不是級聯下降來保持SLO和用戶體驗。
1)何時應用
成癮是不穩定的:p95/p99的增長,taymout,錯誤的答案。
具有嚴格限制/penalti的外部API。
「沈重」的後端(搜索,咨詢,報告),其中撤退加劇了風暴。
高度擁擠的區域,有池枯竭的風險(連接,treds)。
2) CB狀態和過渡
經典三駕馬車:1.Closed-流量正在發生,錯誤/潛伏度度量被計算在內。
2.Open-呼叫立即被拒絕(失敗快)和/或轉換為後退。
3.Half-Open-有限數量的「試用」請求決定是否關閉開關。
打開觸發器
每個窗口的錯誤/定時閾值(例如,≥後者N的50%)。
潛伏閾值(例如p95>目標值)。
組合策略(錯誤∧超時)。
保留時間(cool-down)
固定(例如10-60秒)或自適應(重復觸發時的指數增加)。
3)Taymauts,Retrai和Jitter
Taymauts始終比Apstrim的SLO短,並且在鏈條上保持一致(截止日期)。
Retrai僅用於等效操作;在大多數情況下,1-2次嘗試就足夠了。
Backoff+jitter (full jitter)可防止同步重復波。
Hedging(備用查詢)-經濟且僅適用於非常關鍵的閱讀。
4)Bulkhead絕緣和「保險絲」
按域和流量類型(VIP、背景任務、公共API)劃分連接/操作員/隊列池。
Caps on concurrency for「昂貴」操作。
接管控制:當隊列溢出時,執行前容易發生故障。
5)倒退和退化場景
備選方案
緩存/堆棧響應:「stale-wile-revalidate」,從緩存L2/L3返回數據。
只讀:單元寫作/命令,允許安全讀取。
代孕答復:數據不完整(例如,沒有建議/化身)。
功能禁用:暫時隱藏非關鍵小部件/小部件。
Feature flags:快速改變行為而不發布。
規則
Fallback必須具有確定性,快速且數據安全。
在Log/Trace/度量標準中明確標記退化路徑。
6)優先級和流量分流
VIP/有償計劃-赤字的更大優先級/配額。
利率極限和throttling減輕了退化依賴性的負擔。
Shed load:在穩定之前,質量溫和下降(例如,結果較少、圖像精簡)。
7)可觀察性和信號
CB度量
狀態(closed/open/half-open)和狀態持續時間。
由於以下原因導致的故障比例:CB開放,計時,5xx,retry-exhausted。
p95/p99在斷路器之前和之後潛伏。
通過後退查詢的Kol vo/分數。
Tracing
Spans註釋:「circuit=opened」,「fallback=cache」,「admission=denied」。
與限制(429/RateLimit-)、隊列和連接子彈的相關性。
Logi/審計
打開或關閉的原因、閾值、依賴項ID。
8)合同和協議
HTTP
失誤:「503 Service Unavailable」帶有「Retry-After」(或限制為「429」)。
Partial content/Steal: '200'/'206'帶有降解元數據(例如'X-Degraded: true')。
緩存策略:「緩存控制:stale-if-error,stale-wile-revalidate」。
gRPC
「UNAVAILABLE」,「DEADLINE_EXCEED」,客戶端/代理保單上的轉義語義。
查詢上下文中的最後期限/時間;沿著鏈條傳播截止線。
相似性
用於POST操作的「Idempotency-Key」,邊界重復數據消除。
9)類型實現(偽代碼)
pseudo onRequest(req):
if circuit. isOpen(dep):
return fallbackOrFail(req)
with timeout(T):
try:
resp = call(dep, req)
circuit. recordSuccess(dep, latency=resp. latency)
return resp except TimeoutError or 5xx as e:
circuit. recordFailure(dep)
if circuit. shouldOpen(dep):
circuit. open(dep, coolDown=adaptive())
return fallbackOrFail(req)
半開放樣本
pseudo onTimer():
if circuit. state(dep) == OPEN and coolDownExpired():
circuit. toHalfOpen(dep)
onRequestHalfOpen(req):
if circuit. allowTrial (dep): # e.g. 1 try: call -> success => close catch: reopen with longer coolDown else:
return fallbackOrFail(req)
10)設置閾值
觀察窗口:滑動N秒/查詢。
錯誤閾值:窗口中的20-50%(取決於配置文件)。
潛伏閾值:p95 ≤目標SLO(例如300-500 ms);超額計為CB的「錯誤」。
自適應cool-down:重復觸發時為10 s → 30 s → 60 s。
11)測試和混亂做法
混亂:註入潛伏期/錯誤,DNS故障,丟棄數據包。
Game days:在類似彈簧的環境中啟動「打開」斷路器,驗證後退。
金絲雀:首先為1-5%的流量啟用SV/降級策略。
SLO預算:允許實驗,直到錯誤預算用盡。
12)與多重性集成
CB狀態可以根據負載配置文件來存儲per-dependency per-tenant(對於嘈雜的租戶)或全局存儲。
Fallback數據和緩存按「tenant_id」分段。
優先事項/配額-根據計劃(VIP不應受到Starter行為的影響)。
13)售前支票清單
- Taymauts和截止日期是直通和一致的。
- Retrai是有限的,僅用於偶數操作,具有backoff+jitter。
- CB閾值由負載測試數據證明。
- Fallback路徑存在,快速且安全;定義了策略緩存。
- Bulkhead隔離:分離池/隊列/限制。
- 度量/跟蹤器/logi標記降解和CB狀態。
- 響應合同文檔(HTTP/gRPC)以及標題/代碼示例。
- 混沌場景和遊戲日定期進行;有一個運行手冊。
14)典型錯誤
沒有taymauts → retrai「靠邊」和級聯下降。
單個全局CB代替選擇性(通過結束點/方法)是額外的故障。
開放式斷路器→「空白」屏幕代替降級的UX。
沒有抖動的retrai →同步的查詢風暴。
在短暫的故障中長時間冷靜下來,在持續的情況下過短是「翻轉」狀態。
缺少bulkhead是共享池和「線頭塊」的耗盡。
15)快速選擇策略
高度重要性讀數:CB+Steil Response Cache+Hedging(經濟)。
記錄/付款:嚴格的taymauts,最少的retrais,idempotency keys,沒有「骯臟」的倒退。
外部API:具有激進閾值的CB,自適應冷卻下降,嚴格的旋轉。
脈動負載微服務:bulkheads,caps on concurrency,VIP優先級。
結論
電路破壞者和托管退化是體系結構的「保險」:它們將混亂的拒絕轉化為可預測的行為。清晰的taymauts,有限的jitter中繼器,孤立的池,精心設計的後退路徑和遙測技術使系統具有抗故障依賴性,即使在高峰和緊急時期也能保持SLO。