Trong một hệ phân tán, mọi thứ rồi cũng sẽ hỏng. Các resilience pattern ngăn một lỗi đơn lẻ thác đổ (cascade) thành một sự cố toàn diện.
Trong một hệ phân tán, mọi thứ rồi cũng sẽ hỏng. Các resilience pattern ngăn một lỗi đơn lẻ thác đổ (cascade) thành một sự cố toàn diện.
const breaker = new CircuitBreaker(callPaymentService, {
timeout: 3000, // cho lời gọi thất bại sau 3s
errorThresholdPercentage: 50, // mở nếu >50% lời gọi lỗi
resetTimeout: 10000 // sau 10s, thử một request (half-open)
});
breaker.fallback(() => ({ status: 'queued' })); // suy giảm duyên dáng
CLOSED ──(lỗi vượt ngưỡng)──▶ OPEN
▲ │ (sau resetTimeout)
│ (lần thử thành công) ▼
└────────────── HALF-OPEN ◀──┘
(một request thử)
[ pool A: 10 thread ] → lời gọi payment
[ pool B: 10 thread ] → lời gọi search
Nếu search treo, nó chỉ rút cạn pool B — payment vẫn hoạt động.
Retry không có backoff khuếch đại tải lên một service vốn đã chật vật (một retry storm). Luôn thêm backoff, jitter, và một giới hạn số lần retry.
Các pattern này là thứ biến một lỗi service đơn lẻ không thể tránh khỏi thành một tính năng bị suy giảm thay vì một sự cố toàn site.
Chúng phối hợp với nhau: timeout giới hạn việc chờ, circuit breaker ngừng nện vào các service đã chết, bulkhead chứa lại phạm vi ảnh hưởng, và retry hồi phục từ các trục trặc nhỏ — bỏ bất kỳ cái nào và lỗi vẫn thác đổ.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ