重復和備份策略
重播(retries)有助於在時間故障中幸存下來,但是如果設置不當,則會導致流量雪崩、操作重復和級聯下降。可靠的撤退政策總是從截止日期/時間開始,考慮冪等性,並使用backoff+jitter。
1)基本原則
1.首先是定時/截止日期,然後是轉發。沒有時間限制的重播只會延長故障。
2.Retray-僅用於安全/等效操作。對於不安全的-通過idempotency-keys和事務性保修。
3.Backoff是強制性的。指數或GCRA樣的Jitter以同步波。
4.限制嘗試次數和總預算時間。不要為用戶的SLO退出。
5.尊重基礎設施信號。「429/503」+「Retry-After」,電路中斷器的狀態,隊列限制。
2)Taymauts和截止日期(截止日期)
請求定時<SLO服務,截止日期沿鏈傳播(HTTP 標題/gRPC context)。
Taymauts的組成:總計(第一次嘗試+backoff+以後)≤自定義的截止日期。
閱讀/記錄的不同時間:記錄更短,更嚴格;讀數允許拼寫。
3)相似性和安全重播
閱讀(GET/IDEMPC):在「5xx」、「UNAVAILABLE」、網絡時間表中安全重復。
記錄:- 在邊界上使用「Idempotency-Key」(HTTP)或request-ID;服務器必須進行重復數據消除。
- 寫出等效處理程序:「upsert」,「at-least-once」+補償(傳奇)。
- 外部付款/互惠-僅具有偶數密鑰和運營日誌。
4)backoff算法
Exponential:「base 2^attempt」,限於「max_backoff」。
Decorrelated Jitter (full/equal jitter):用於客戶端同步的範圍隨機性。
GCRA/Token-Bucket之類的延遲:與等級限制一致。
邊界:「initial_backoff」(50-200毫秒閱讀;200-500 ms記錄),「max_backoff」(1-5 s),「max_elapsed」(例如3-10 s)。
推薦模板:指數backoff+full jitter。
5)決定「重復/不重復」的政策"
我們在以下方面重復:- 網絡錯誤/時間限制,「429」(尊重'Retry-After'),「軟」「5xx」(「502/503/504」),gRPC 「UNAVAILABLE/DEADLINE_EXCEED」。
- 「4xx」(某些腳本中的「409/429/408」除外),業務錯誤,「401/403」,驗證錯誤,顯然是「DoNotRetry」標誌。
- '409 Conflict'-有時在共識/鎖定後延遲重播。
- eventually consistent reading的「404」是帶有小背景的一到兩倍的回程。
6)Concurrency caps和「暴風雨撤退」
限制同步per-client/per-tenant/per-endpoint中繼。
請求嘗試的總限制(例如2-3)。
通過管理控制來制動「熱」結束點,以免排隊。
7)與Circuit Breaker和限制互動
如果CB打開,請不要直接執行retrai-返回或等待「半打開」樣本。
在「429」-尊重「Retry-After」;如果沒有它-應用「軟」backoff。
Retrai可以增加負載;應用自適應閾值(在事件中降低「max_attempts」)。
8)協議和合同
HTTP
編碼:「408/429/5xx」。
標題:「Retry-After」,「RateLimit-」家族,「Idempotency-Key」,「Request-Id」。
客戶必須發送「X-Request-Timeout」/「Deadline-At」(如果接受的話)。
gRPC
使用截止日期上下文;尊重「UNAVAILABLE」,「DEADLINE_EXCEED」,每種方法的復制品。
對於冪等的RPC-包括復古;對於突變-僅支持冪等。
9)隊列、背景任務和集成
One-least-once處理程序→等效操作、按鍵重復數據消除。
延遲時間用於嘗試之間的後退(例如5s/30 s/2m)。
Dead-letter queue(DLQ)具有嘗試和手動處理限制。
Outbox/CDC-確保重播不會破壞事務完整性。
10) Hedging vs Retries
Hedging(鏡像查詢)對於尾部潛伏期的高臨界讀數很有用。
限制:不多於X%的查詢,延遲的「開始格雷斯」(例如p95潛伏期),取消失敗者。
不要在沒有強冪等性的情況下將刺痛應用於寫入操作。
11)遙測和可觀察性
Теги: `tenant_id`, `endpoint`, `attempt`, `decision` (retry/skip), `reason`, `backoff_ms`, `deadline_ms`, `idempotency_key`.
度量標準:中繼比例,中繼後成功,p95/p99「端到端」,超過截止日期的數量,CB觸發。
審計記錄:「嘈雜」鍵的頂部N/尾部,與429/503相關。
12)測試和混亂
輪廓為:「pila」(暴風雨),「storm」(大量taymauts),「粘性」錯誤(每個N-),潛伏尾巴。
限量/緩存/隊列堆棧故障,clock-skew。
檢查總持續時間(attempts+backoff)是否適合於SLO。
13)政策偽代碼
pseudo handle(req, deadline):
attempt = 0 backoff = initial()
while attempt < MAX_ATTEMPTS and now() < deadline:
attempt += 1 with timeout(per_attempt_timeout(deadline, attempt)):
try:
resp = call(req)
if isRetryableStatus(resp): raise Retryable(resp. status)
return resp except Retryable as e:
if circuit. isOpen(dep) or! isIdempotent(req): break sleep(jitter(backoff))
backoff = min(exp(backoff), MAX_BACKOFF)
except NonRetryable:
break return fail_or_fallback(req)
14)配置模板(示例)
yaml retries:
default:
max_attempts: 3 initial_backoff_ms: 150 max_backoff_ms: 2000 strategy: exponential_full_jitter respect_retry_after: true per_attempt_timeout_fraction: 0. 4 # 40% of remaining deadline hedging:
enabled: false read_heavy:
max_attempts: 4 initial_backoff_ms: 80 max_backoff_ms: 1200 hedging:
enabled: true start_after_p95_ms: 300 max_extra_requests_ratio: 0. 05 write_strict:
max_attempts: 2 initial_backoff_ms: 250 max_backoff_ms: 1000 idempotency_required: true
limits:
concurrent_retries_per_tenant: 100 concurrent_retries_per_endpoint: 20
15)售前支票清單
- 截止日期通過挑戰傳播;總持續時間≤ SLO。
- 具有抖動的反向算法;參數由負載測試驗證。
- 相同性:記錄/日誌/補償。
- Retray政策在閱讀和記錄方面有所不同;respect `Retry-After`.
- 中繼器的競爭性和嘗試總數是有限的。
- 與circuit breaker和rate limits的集成已配置。
- 遙測:標簽,度量,原因邏輯;dashbords p95/p99,回程後的成功率。
- 測試「風暴」和潛伏尾巴,任務的DLQ。
- 客戶文檔:代碼/標題,後退和取消示例。
16)典型錯誤
沒有時間線/截止線的重播是「永恒的期望」。
沒有噴射器的固定暫停是同步波和DDoS自處理。
不安全的錄音的復制品沒有同步-雙重和同步。
忽視「Retry-After」和CB信號是事件的升級。
由於缺少caps和管理控制,隊列中的瓶頸。
缺乏原因遙測/撤退解決方案是「盲目飛行」。
17)快速食譜
公開閱讀API:3次嘗試,'initial=100 ms','max=1s',full jitter,高達5%的流量。
關鍵記錄(付款):1-2次嘗試max,嚴格的計時器,強制性的「Idempotency-Key」,沒有抱怨。
外部集成:尊重「429/Retry-After」,「max_attempts=3」,「max_backoff=2-5s」,出站流限制。
背景任務:delay-backoff (5 s → 30 s → 2m), DLQ,等效處理程序。
結論
良好的重播策略是快速恢復和受控故障之間的平衡。截止線,等效性,帶有抖動的指數反射,限制競爭和對基礎設施信號的尊重將從「風暴」轉變為提高SLO可靠性和保留性的工具。