Retries và Backoff: Phục hồi mà Không Khuếch đại Sự cố
Vận hành retry an toàn với backoff, jitter, ownership và giới hạn tải.
Bản đồ học tập phát triển phần mềm bởi Tran Trong Thuc · Về dự án Atlas · Cập nhật lần cuối: 10 thg 9, 2026
Retries và Backoff: Phục hồi mà Không Khuếch đại Sự cố
Tóm tắt
Chỉ retry khi attempt mới có khả năng giúp và việc lặp là an toàn. Retry cũng tăng tải lên dependency có thể đang lỗi.
Phân loại trước khi retry
| Tín hiệu | Quyết định mặc định |
|---|---|
| transient transport error | retry nếu an toàn và còn budget |
429 / 503 | back off; tôn trọng Retry-After hợp lệ |
| auth / validation / business rejection | không retry input không đổi |
| timeout sau write có outcome mơ hồ | cần idempotency hoặc reconciliation |
Làm write an toàn trước
Nếu attempt đầu có thể đã commit, request mới có thể tạo effect trùng. Dùng lại idempotency identity hoặc đối soát state trước. Retry không tự tạo idempotency.
Backoff, jitter và giữ trong deadline
100 ms -> 200 ms -> 400 ms -> capped delayExponential backoff giãn attempt; jitter ngẫu nhiên hóa wait để fleet không thức cùng lúc. Cap attempt/delay và không sleep quá deadline còn lại.
Chọn một retry owner
Nếu Client, Service A và Service B đều cho ba total attempt, một request gốc có thể tạo 3 × 3 × 3 = 27 attempt. Chọn một retry owner có đủ context; tính cả SDK retry.
Bảo vệ cả fleet
Khi failure lan rộng, retry budget hoặc token bucket có thể giảm retry. Quan sát request gốc tách khỏi số attempt, cùng lý do retry, cạn budget và saturation.
Kịch bản production
Gateway gọi Checkout → Inventory → database. Khi latency tăng, mọi layer retry hai lần, dùng deterministic backoff và write thiếu stable idempotency identity.
Hậu quả: một user request có thể tạo tới 27 database attempt; retry đồng bộ tạo burst, saturation nặng hơn và ambiguous write có thể tạo reservation trùng.
Nguyên nhân cốt lõi: retry ownership bị rải ở nhiều layer, failure không được phân loại, write không an toàn khi lặp và timing làm cả fleet đồng bộ.
Cách khắc phục chuẩn: chọn một retry owner, chỉ retry transient failure, giữ logical request identity, bound attempt trong deadline còn lại, dùng exponential backoff có jitter, tôn trọng Retry-After và dừng khi retry budget cạn. Tách original request khỏi attempt.
Tự kiểm tra
SDK và service wrapper của bạn đều đã retry. Dependency bắt đầu trả 503. Có nên thêm retry loop ở gateway không?
Xem reasoning
Không. Trước tiên hãy tìm toàn bộ retry hiện có, chọn một owner và phối hợp total attempt/deadline budget rồi mới đổi policy.
Checklist vận hành retry
- Chỉ retry failure tạm thời, không retry lỗi deterministic.
- Làm ambiguous write idempotent hoặc đối soát trước.
- Giữ mọi retry trong deadline còn lại.
- Chọn một retry owner và tính cả SDK retry.
- Cap backoff, thêm jitter, tôn trọng
Retry-After. - Giới hạn retry toàn fleet và tách request gốc khỏi attempt trong observability.
Agent rule
Trước khi thêm retry, hãy tìm failure class, safety, deadline, retry hiện có, ownership, bounds, backoff/jitter, server hint, fleet budget và telemetry.
Nguồn
Nguồn chính kiểm tra ngày 2026-09-15: RFC 9110, AWS retry guidance, AWS SDK retry behavior.
Timeout: Vận hành với ngân sách thời gian rõ ràng
Đặt, truyền, quan sát và tinh chỉnh timeout để dependency chậm chỉ giữ tài nguyên trong giới hạn mà không tạo cảm giác chắc chắn giả.
Logs, Metrics & Traces: Chẩn đoán production bằng bằng chứng tương quanNew
Học cách kết hợp logs, metrics, traces, correlation identifiers, cardinality budget và sampling để chẩn đoán production mà không bị ngập trong telemetry.