可持續性測試
1)基本概念和目標
可靠性(reliability)-運行概率;彈性(resilience)-故障發生時和之後的行為。
SLO/預算錯誤:降級的「可接受性」標準。
Steady-state hypothesis:對穩定指標的正式期望(例如p95 <200 ms,error rate <0。5%).如果假設成立,該實驗被認為是成功的。
故障類型:網絡(潛伏期、丟失/雙重、斷裂)、計算(CPU,內存)、擦傷(I/O,磁盤耗盡)、依賴項(5 xx, timeouts, rate-limit),邏輯(部分事件,「緩慢退化」)、操作(發布,config)、深色(split)-brain,每小時輪班)。
2)可持續性金字塔
1.單位邏輯故障測試(retrai,等效性,taymout)。
2.分配有故障插入適配器(Testcontainers/tc-netem)。
3.具有網絡/DB/緩存和 real-world配置文件的集成/系統。
4.在runbook'am上進行預測前的混沌實驗(然後限制銷售)。
5.Game dey是團隊的腳本演習(人員+工具)。
3)可觀察性作為基礎
SLI:潛伏性p50/p95/p99, error rate, saturation (CPU/heap/FD/IOPS), drop/timeout, queue depth。
跟蹤:查找故障下的「瓶頸」。
語義可持續性指標:成功的分數分數,shed請求分數,自我修復率(MTTR)。
實驗標記:'chaos。experiment_id',「phase=inject/recover」在事件/邏輯中。
4)故障註射目錄(faults)
網絡:延遲/擠壓,丟失/復制/重建,吞吐量限制,批量「風暴」,TLS懸崖。
主機:CPU限制,泄漏/內存限制,GC暫停,句柄用盡,「clock skew」。
存儲:潛伏期增長,EROFS,ENOSPC,復制副本退化,領導者損失。
相關性:5xx/429、減速、DNS翻轉、過時證書、限額、「部分響應」。
數據:記錄損壞,線程中的「漏洞」,事件配對,版本沖突。
操作:發行失敗,幻燈片標記,config漂移,手動錯誤(在模擬中)。
5)可持續性模式(要檢查)
每個RPC上帶有抖動和taymauts的復制品。
電路斷路器(開口/半開口,指數恢復)。
Bulkheads(將池/隊列隔離到關鍵域)。
負載共享(飽和時重置低優先級查詢)。
Backpressure(鏈上信號,並發限制)。
Idempotency(「副作用」上的冪等鍵)。
在來源退化的情況下進行積壓和穩定。
Graceful Degradation(輕量級響應,stale數據,禁用圖片)。
Timeout-budget(呼叫鏈上的總時間預算)。
原子/補償(Saga/Outbox/Transactional Inbox)。
定額和復制(R/W定額,為了可用性而降級一致性)。
反entropy/反射(事件的「漏洞」中恢復)。
6)註射和期望處方(偽代碼)
Retray with jitter和breaker
for attempt in 1..N:
if breaker. open(): return fallback()
res = call(dep, timeout = base 0. 8)
if res. ok: return res sleep(exp_backoff(attempt) jitter(0. 5..1. 5))
if attempt == N: breaker. trip()
return fallback()
Shading and Backpresher
if queue. depth() > HIGH cpu. load() > 0. 85:
if request. priority < HIGH: return 503_SHED limiter. acquire () # constrain concurrency
相似性
key = hash("payout:"+external_id)
if store. exists(key): return store. get(key)
result = do_side_effect()
store. put(key, result, ttl=30d)
return result
7)實驗: 情景和假設
7.1「緩慢成癮」
註射:+400 ms p95到外部API。
預期:Taymauts的增長≤ X%,打開斷路器,後退響應,保留p99服務<SLA,在後退時沒有級聯。
7.2「部分緩存丟失」
註射:50%的Redis/Kesh Shard節點故障。
等待:小姐增加,但沒有雪崩到源頭(請求coalescing/immutable TTL),自動加熱和恢復。
7.3 「DB中的Split-brain」
註射:失去領導者,切換到副本。
等待:短暫的錄音,從法定人數中讀取,沒有數據丟失,Outbox不會丟失消息。
7.4 「ENOSPC/磁盤已滿」
註射:95-100%的磁盤。
等待:緊急日誌輪換,非鎖相故障,關鍵日誌保存(WAL),Alerta和自動移動。
7.5「交通風暴」
註射:× 3個RPS到10分鐘的熱末端。
等待:低優先權著色、「核」軌道穩定的p95、限制內隊列增長、缺乏DLQ風暴。
7.6 «Clock Skew»
註射:將noda時間移至+/− 2分鐘。
等待:正確的TTL/簽名(leeway),後臺的單調計時器,允許漂移時的有效令牌。
8)實驗環境與安全
從pre-prod開始,合成數據盡可能接近configa/拓撲的銷售。
在銷售中-僅受控窗口,幻燈片,回合振幅,自動回滾和「紅色按鈕」。
Guardrails:RPS限制/錯誤,SLO警衛,在嚴重事件中阻止發布。
強制性的運行手冊:如何回滾,打電話給誰,在哪裏觀看。
9)自動化和CI/CD
實驗目錄作為代碼(YAML/DSL):目標,註入,度量,閾值,回滾的「按鈕」。
每個版本中的煙霧混亂:在牛排中短暫註射(例如2分鐘+200毫秒成癮)。
夜間矩陣運行:服務×故障類型。
釋放門:如果穩定性低於閾值(例如「慢依賴性」下的'fallback coverage <95%'),則禁止丟棄。
10)數據和一致性
檢查補償(Saga):部分完成的操作必須達到商定的狀態。
測試事件的重播/配對、訂單交付、「孔」和繼電器。
驗證失敗後的域不變量:平衡不是負的,事務不會「卡住」,限制不會中斷。
11)反模式
僅測試快感路徑和無故障負載。
沒有jitter的retrai →一場退化風暴。
缺乏全球時間預算→級聯時間預算。
所有任務的單個池→無隔離(bulkheads)。
「無限」隊列→ 潛伏期/OOM的增長。
實驗的零遙測→「盲目」混沌實踐。
銷售混亂,沒有回滾/限制/負責任的所有者。
12)建築師支票清單
1.是否定義了階梯狀態假設和SLO?
2.每個RPC上都有taymouts,帶擠壓器的轉發,破發器?
3.實現了牛頭、限量版、背壓式、裝載式剪裁?
4.緩存是穩定的:coalescing,緩存風暴保護,加熱?
5.Outbox/Saga的副作用,等效鍵?
6.法定人數/復制/傳送器是否經過測試?
7.CI/CD中有實驗目錄,夜間混亂和大門?
8.度量/跟蹤標記實驗,有行車記錄嗎?
9.Runbook'和'紅色按鈕'準備就緒,責任已經指定?
10.定期與Dev/SRE/Support一起玩遊戲?
13)迷你工具和腳本示例(YAML草圖)
網絡(tc/netem)
yaml experiment: add-latency target: svc:payments inject:
netem:
delay_ms: 300 jitter_ms: 50 loss: 2%
duration: 10m guardrails:
error_rate: "< 1%"
p95_latency: "< 400ms"
CPU/Heap
yaml inject:
cpu_burn: { cores: 2, duration: 5m }
heap_fill: { mb: 512 }
依賴性
yaml inject:
dependency:
name: currency-api mode: slow p95_add_ms: 500 fallback_expectation: "serve stale rates ≤ 15m old"
結論
可持續性測試不是「混亂的把戲」,而是使系統在故障下可預測的紀律。清晰的假設,遙測,受控實驗目錄以及嵌入到模式體系結構中(定時器,斷路器,絕緣,等效性),將潛在事件轉化為受控場景。該團隊對發布有信心,即使處於故障狀態,用戶也能獲得穩定的服務。