Khi gọi các dịch vụ bên ngoài (Payment Gateway, SMS OTP, Logistic API), hầu hết lập trình viên chỉ dùng lệnh try-catch hoặc thêm cơ chế Retry (Thử lại). Tuy nhiên, khi đối tác thực sự bị sập, việc cố gắng Retry hàng ngàn lần chỉ khiến hệ thống của bạn chết nhanh hơn.
Dưới đây là ma trận so sánh các cơ chế phòng thủ và hướng dẫn cài đặt Circuit Breaker – cấp độ phòng thủ cao nhất cho microservices.
1. Ma trận so sánh các chiến lược xử lý lỗi API
| Tiêu chí | Simple Timeout | Exponential Retry | Circuit Breaker Pattern |
| Phản ứng khi API ngoài chậm | Ngắt kết nối sau X giây | Gọi lại nhiều lần với độ trễ tăng dần | Cắt đứt ngay lập tức (Chặn từ gốc) |
| Tác động lên Server nội bộ | Giữ tài nguyên trong thời gian Timeout | Gấp 3-5 lần tải lên Connection Pool | Giải phóng RAM/Worker trong < 1ms |
| Tác động lên API đối tác | Vẫn tiếp tục gửi request | Giội thêm bão request làm đối tác nghẽn hơn | Cho đối tác thời gian để tự phục hồi |
| Trải nghiệm người dùng | Đợi hết Timeout rồi báo lỗi | Đợi rất lâu trước khi thất bại | Nhận ngay dữ liệu dự phòng (Fallback) |
2. Triển khai Circuit Breaker dạng Class đơn khối trong TypeScript
Thay vì phụ thuộc vào thư viện bên ngoài, bạn có thể bọc lớp phòng thủ này bằng mã nguồn thuần:
TypeScript
enum State { CLOSED, OPEN, HALF_OPEN }
export class CustomCircuitBreaker {
private state = State.CLOSED;
private failureThreshold = 3; // 3 lỗi liên tiếp -> Bật OPEN
private cooldownPeriod = 20000; // 20 giây nghỉ
private failures = 0;
private nextAttempt = Date.now();
async fire<T>(requestFn: () => Promise<T>, fallbackFn: () => T): Promise<T> {
if (this.state === State.OPEN) {
if (Date.now() > this.nextAttempt) {
this.state = State.HALF_OPEN; // Chuyển sang thử nghiệm
} else {
return fallbackFn(); // Trả ngay dữ liệu dự phòng
}
}
try {
const response = await requestFn();
this.reset();
return response;
} catch (err) {
this.handleFailure();
return fallbackFn();
}
}
private handleFailure() {
this.failures++;
if (this.failures >= this.failureThreshold || this.state === State.HALF_OPEN) {
this.state = State.OPEN;
this.nextAttempt = Date.now() + this.cooldownPeriod;
}
}
private reset() {
this.failures = 0;
this.state = State.CLOSED;
}
}
Ba kịch bản Fallback chuẩn thiết kế cho ứng dụng
- Fallback dữ liệu mặc định (Graceful Degradation): Khi API đề xuất sản phẩm bị lỗi, trả về danh sách “Sản phẩm bán chạy nhất” được lưu cố định trong bộ nhớ.
- Fallback Cache cũ (Stale-While-Revalidate): Khi API thời tiết/tỷ giá bị sập, hiển thị dữ liệu của 1 tiếng trước kèm nhãn “Cập nhật gần nhất 1 giờ trước”.
- Fallback kênh song song: Khi API SMS OTP thất bại quá 3 lần, tự động chuyển luồng gửi OTP qua Email hoặc Zalo Notification Service.
Cài đặt Circuit Breaker là sự nâng cấp tư duy từ “viết code chạy đúng” sang “xây dựng hệ thống có khả năng tự phục hồi”.


