Part 05 · Resilience · 5.1.09

Timeout, retry, rate limit và backpressure

Resilience là quản lý capacity và failure boundary, không phải thêm retry vào mọi exception. Deadline, retry ownership, breaker, bulkhead và rate limit phải cùng bảo vệ business outcome.

Invariant: mọi request có overall deadline; mỗi retry phải còn đủ budget, replay-safe và không nhân tải qua nhiều tầng.

1. Deadline budget

Phân bổ overall deadline cho queue, pool acquisition, connect, TLS, write, server processing, downstream và response read. Mỗi timeout phải ngắn hơn remaining deadline; propagate deadline/cancellation khi protocol hỗ trợ. Timeout không chứng minh operation chưa xảy ra, nên side effect vẫn cần idempotency/reconciliation.

remaining = caller_deadline - now
pool/connect/read timeout = min(local_cap, remaining - safety_margin)
stop when remaining <= 0; do not start another retry

2. Retry và hedging

Chỉ retry transient failure và replay-safe operation. Dùng bounded exponential backoff + jitter, tôn trọng Retry-After, dừng theo deadline/attempt cap. Gateway × client × service retries có thể nhân tải; chỉ một tầng nên sở hữu retry policy. Hedging giảm tail latency chỉ với idempotent reads, duplicate-capacity budget và cancellation của bản chậm.

FailureDefault action
Validation/authz/most 4xxKhông retry; sửa request hoặc credential
Connection reset trước write/known safe readCó thể retry bounded nếu operation replay-safe
429/503/temporary overloadRetry theo Retry-After và global deadline, giảm concurrency
Timeout sau unknown side effectKhông retry mù; query/reconcile/idempotency key

3. Circuit breaker

Closed đo error/slow-call rate; open fail fast; half-open gửi probe để kiểm tra recovery. Breaker không thay timeout. Scope theo dependency/operation để một endpoint lỗi không chặn toàn service; fallback không được âm thầm trả dữ liệu sai.

4. Bulkhead và connection capacity

Tách thread, connection và concurrency quota để dependency không chiếm toàn capacity. Semaphore limit phù hợp virtual threads; executor pool/queue phải bounded. Queue dài biến overload thành latency và memory pressure, không phải resilience.

5. Rate limiting

Fixed/sliding window, token bucket và leaky bucket có trade-off burst, fairness và storage. Dimension theo principal/tenant/IP/operation/resource cùng global ceiling; distributed counter consistency và fail-open/closed tùy risk. Trả 429 với limit guidance nhưng không lộ policy giúp attacker tối ưu abuse.

DimensionUse caseFailure consideration
Principal/tenantFairness và business quotaIdentity spoofing hoặc shared account
IP/deviceAnonymous abuse protectionNAT false positive; IPv6/proxy parsing
Operation/resource costReport/export/payment protectionKhông chỉ đếm request giống nhau
GlobalProtect total capacityFail-open có thể overload; fail-closed có blast radius

6. Load shedding và backpressure

Từ chối sớm low-priority hoặc expensive work khi saturation; dùng bounded queue, admission control, page/payload limit và load-shed signal. Backpressure khiến producer chậm lại hoặc giảm concurrency; buffer vô hạn chỉ trì hoãn crash.

7. Failure testing và evidence

Inject latency, reset, partial response, duplicate, DNS failure, TLS expiry, pool exhaustion và retry storm. Quan sát attempts, deadline propagation, queue/pool occupancy, breaker state, rate-limit decision và business outcome (không chỉ HTTP 200).

Definition of done: có timeout budget, retry owner, idempotency rule, breaker/bulkhead scope, rate-limit dimensions, shedding behavior và dashboard cho saturation/error/outcome.
Tài liệu: RFC 9110 HTTP Semantics · RFC 6585 Additional Status Codes · AWS Builders' Library: retries/backoff