Claude lại sập vào ngày 24/8 — lỗi tăng đột biến trên claude.ai, API, Claude Code và Claude Cowork, bắt đầu khoảng 05:06 UTC, khắc phục sau khoảng 3 tiếng. Bản thân sự việc không có gì đặc biệt, ngoại trừ nó không phải ngoại lệ: Anthropic đã ghi nhận gián đoạn vào các ngày 5, 12, 13, 16, 18, 20 và giờ là 24 tháng 8, và theo các dịch vụ theo dõi, tổng số sự cố năm 2026 đã vượt 160 — bất chấp gói đầu tư compute $71B được kỳ vọng giải quyết chính xác vấn đề này. Năm nay tôi có ba khách hàng khác nhau hỏi tôi một câu tương tự: “liệu sản phẩm của mình phụ thuộc vào Claude/GPT/Gemini có đáng lo không” — và câu trả lời của tôi không đổi: việc model provider sập không phải là giả định bạn lên kế hoạch phòng ngừa, mà là sự kiện lặp lại bạn phải thiết kế kiến trúc để chịu được, giống như bạn thiết kế cho database failover hay payment gateway timeout của bên thứ ba.
Sai lầm tôi thấy nhiều nhất không phải là “không xử lý lỗi” — mà là xử lý lỗi chỉ bao phủ trường hợp dễ hình dung nhất (HTTP 500) và bỏ sót những trường hợp thực sự gây đau đầu trong production.
Bốn kiểu lỗi, không chỉ một
Hầu hết team chỉ bọc try/catch quanh LLM call, log lỗi rồi coi như xong. Điều đó chỉ bao phủ khoảng một phần tư những gì thực sự xảy ra:
- Lỗi cứng — 5xx, connection refused, timeout. Ồn ào, dễ bắt, dễ alert.
- Rate limiting — 429. Đầu năm 2026, lỗi rate-limit chiếm khoảng 60% tổng số lỗi LLM API toàn ngành — nghĩa là đây là trường hợp phổ biến, không phải edge case.
- Suy giảm chất lượng âm thầm — request thành công, trả về 200, nhưng output kém hơn một cách tinh vi: reasoning bị cắt cụt, model checkpoint bị đổi ở phía upstream, context window bị áp lực khiến model kết thúc sớm. Đây là kiểu lỗi mà circuit breaker chỉ dựa vào HTTP status code sẽ không bao giờ bắt được.
- Sập một phần — một model tier bị down (Opus) trong khi tier khác (Haiku) vẫn ổn, hoặc một region bị suy giảm trong khi region khác không. Health check kiểu on/off nhị phân bỏ sót hoàn toàn trường hợp này.
Nếu code resilience của bạn chỉ xử lý trường hợp 1, bạn được bảo vệ cho những lần sập lên báo, nhưng lại hở sườn với những lỗi âm thầm gây tốn ticket support nhiều nhất.
Pattern nhiều lớp thực sự trụ vững
Kiến trúc đã chứng minh hiệu quả trên các hệ thống tôi làm trong năm nay có 4 lớp, áp dụng theo thứ tự:
type LLMResult = { text: string; provider: string; degraded: boolean };
async function callWithResilience(prompt: string): Promise<LLMResult> {
// 1. Retry lỗi tạm thời với backoff + jitter, tôn trọng header Retry-After
for (const provider of [primaryProvider, secondaryProvider, tertiaryProvider]) {
if (circuitBreaker.isOpen(provider.name)) continue; // 2. Circuit breaker
try {
const res = await retryWithBackoff(() => provider.call(prompt), {
maxAttempts: 3,
respectRetryAfter: true,
});
circuitBreaker.recordSuccess(provider.name);
// 3. Quality gate, không chỉ kiểm tra HTTP status
if (looksTruncatedOrDegraded(res)) {
circuitBreaker.recordDegradation(provider.name);
continue; // chuyển sang provider tiếp theo
}
return { text: res.text, provider: provider.name, degraded: false };
} catch (err) {
circuitBreaker.recordFailure(provider.name);
// chuyển sang provider tiếp theo
}
}
// 4. Bulkhead: phương án cuối là response cache/canned, không phải lỗi cứng cho user
return { text: cachedFallbackResponse(prompt), provider: "cache", degraded: true };
}
Bốn điểm đáng lưu ý không rõ ngay từ đoạn code:
Circuit breaker cần tín hiệu lỗi riêng, tách khỏi exception thô. recordDegradation tồn tại có chủ đích — nếu chỉ trip breaker khi có exception được throw, một provider âm thầm trả về nội dung tệ vẫn tiếp tục nằm trong vòng quay vô thời hạn. Tôi định nghĩa “degraded” theo từng use case: với endpoint tóm tắt có thể là độ dài output dưới ngưỡng; với coding agent có thể là diff không parse được.
Thứ tự provider không cố định — đó là quyết định routing. Danh sách [primaryProvider, secondaryProvider, tertiaryProvider] nên được xác định dựa trên nhiều yếu tố hơn là “ai đang up”. Chi phí và latency budget cũng quan trọng — tôi từng thấy team đặt một model rẻ hơn ở vị trí thứ hai trong chuỗi không phải như một sự hạ cấp, mà là fallback đúng đắn cho task vốn không cần frontier reasoning. Đây chính là bản năng “model routing” đang trở thành thực hành chuẩn khi khoảng cách giá giữa model frontier và mid-tier ngày càng rộng (chủ đề xứng đáng có bài riêng).
Bulkhead là quyết định UX, không chỉ kỹ thuật. Response fallback từ cache với degraded: true cho phép UI hiển thị “trả lời từ cache, có thể không mới nhất” thay vì nói dối về độ mới hoặc ném lỗi 500 vào mặt user. Hãy quyết định “degraded chấp nhận được” trông như thế nào cho sản phẩm của bạn trước khi sự cố xảy ra, không phải trong lúc sự cố — đó là cuộc trò chuyện về sản phẩm, và sẽ tệ hơn nhiều nếu phải bàn nó khi đang xảy ra sự cố thật.
Test failure path, không chỉ happy path. Điều có leverage cao nhất tôi thêm vào codebase của khách hàng năm nay là một chaos test buộc provider chính fail trong CI và assert rằng fallback chain thực sự kích hoạt và trả về kết quả hợp lý. Hầu hết team “có fallback” chưa bao giờ thực sự thử nghiệm nó — lần test thật đầu tiên chính là lúc sự cố xảy ra, thời điểm tệ nhất để phát hiện API contract của fallback provider đã drift từ sáu tháng trước.
Cái giá thực sự phải trả
Không có gì miễn phí ở đây. Tích hợp provider thứ hai nghĩa là phải maintain thêm một bộ prompt (các model không phản hồi giống nhau với cùng một prompt), thêm một quan hệ billing, và overhead latency thực sự trên happy path nếu không cẩn thận trong cách cấu trúc retry. Với tính năng ít quan trọng, cái giá đó không đáng trả — một thông báo lỗi đơn giản kèm nút retry là câu trả lời hợp lý. Quyết định mang tính judgment là khoanh vùng pattern này cho những phần sản phẩm mà LLM call bị down thực sự chặn user khỏi việc họ đến để làm, và chỉ xây dựng pattern nhiều lớp ở đó. Xây ở khắp mọi nơi cũng sai lầm không kém việc không xây ở đâu cả.
166 lần sập và còn tăng không phải lý do để nghi ngờ một provider cụ thể nào hơn provider khác — mọi lab frontier đều có một năm vất vả với việc scale hạ tầng. Đó là lý do để ngừng coi “model API đang up” là một giả định mà kiến trúc của bạn được phép mặc định.