VISEN GROUP
Technology & Engineering

Bảng so sánh 3 cơ chế chống sập API: Timeout, Retry vs. Circuit Breaker

October 21, 20263 min readUncategorized

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 TimeoutExponential RetryCircuit Breaker Pattern
Phản ứng khi API ngoài chậmNgắt kết nối sau X giâyGọi lại nhiều lần với độ trễ tăng dầnCắ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 TimeoutGấp 3-5 lần tải lên Connection PoolGiải phóng RAM/Worker trong < 1ms
Tác động lên API đối tácVẫn tiếp tục gửi requestGiội thêm bão request làm đối tác nghẽn hơnCho đố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ạiNhậ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

  1. 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ớ.
  2. 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”.
  3. 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”.

Leave a Reply

Your email address will not be published. Required fields are marked *