Cách tách kênh kép đưa độ khả dụng mô hình từ 97% lên 99,8%
Trần độ khả dụng của một kênh cung cấp duy nhất nằm ở đâu? Chúng tôi nhìn lại 18 tháng dữ liệu sản xuất và mổ xẻ cách triển khai cùng hiệu quả của tách kênh kép.
Vấn đề: trần của một kênh duy nhất
Cuối năm 2024, các mô hình cốt lõi của chúng tôi (Claude Sonnet, GPT-4o) kết nối tới nhà cung cấp thượng nguồn qua một kênh duy nhất. Độ khả dụng hằng tháng dao động giữa 96,5% và 97,2%. Nghe ổn?
Tính ra thì không. 97% khả dụng nghĩa là khoảng 21 giờ ngừng hoạt động mỗi tháng. Với các đội xem chúng tôi là hạ tầng, con số đó không thể chấp nhận.
Gốc rễ không nằm ở code của chúng tôi — mà ở sự biến động của chính các nhà cung cấp thượng nguồn. Một kênh sập là toàn bộ lưu lượng bị ảnh hưởng. Phụ thuộc một điểm là vấn đề kiến trúc, không phải vấn đề vận hành.
Thiết kế: tách kênh kép
Ý tưởng cốt lõi rất đơn giản: mỗi mô hình duy trì hai kênh cung cấp độc lập (Channel A / Channel B), làm dự phòng cho nhau.
Logic định tuyến
Khi một yêu cầu đến, bộ định tuyến làm ba việc:
- Truy vấn điểm sức khỏe thời gian thực của cả hai kênh (dựa trên tỷ lệ lỗi và độ trễ trong 5 phút gần nhất)
- Ưu tiên kênh có điểm sức khỏe cao hơn
- Nếu kênh chính trả 5xx hoặc quá hạn, thử lại ngay trên kênh dự phòng (phần lớn trường hợp người dùng không nhận biết)
async function route(model: string, req: Request) {
const [chA, chB] = await getChannels(model)
const primary = chA.healthScore >= chB.healthScore ? chA : chB
const fallback = primary === chA ? chB : chA
try {
return await primary.forward(req, { timeout: 30_000 })
} catch (e) {
// kênh chính lỗi, chuyển ngay — người dùng không nhận biết
metrics.record('failover', { model, from: primary.id })
return await fallback.forward(req, { timeout: 30_000 })
}
}
Tính điểm sức khỏe
Điểm sức khỏe của mỗi kênh là giá trị 0–100 trên cửa sổ trượt:
- Tỷ lệ lỗi, trọng số 70% — 5xx / tổng số yêu cầu trong 5 phút gần nhất
- Độ trễ, trọng số 30% — mức lệch của P95 so với đường cơ sở
Kênh dưới 50 tự bị giảm trọng số; kênh dưới 30 liên tục 3 phút bị tạm rút khỏi pool định tuyến, được một đầu dò heartbeat độc lập thăm dò định kỳ và thêm lại sau khi phục hồi.
Kết quả: 18 tháng dữ liệu sản xuất
Sau khi tách kênh kép ra mắt, độ khả dụng tăng lên 99,81%, và thời gian phục hồi giảm từ p95 4 phút xuống p95 8 giây — đại đa số người dùng chưa bao giờ nhận ra sự cố phía nhà cung cấp.
| Chỉ số | Một kênh (2024 Q4) | Kênh kép (2025 Q3) |
|---|---|---|
| Khả dụng | 97,0% | 99,81% |
| Ngừng hoạt động TB/tháng | 21h | 1,4h |
| failover p95 | — | 8s |
Những vấp váp
- Ban đầu chưa tách ngân sách timeout: kênh dự phòng cũng đặt timeout 30s, khiến thời gian chờ tăng gấp đôi khi sự cố. Đổi sang chính 30s / dự phòng 20s, độ trễ cảm nhận giảm 35%.
- Điểm sức khỏe trễ: cửa sổ 5 phút phản ứng chậm với sự cố đột ngột, sau đó chúng tôi thêm tín hiệu nhanh “lỗi gần đây” 30 giây.
- Bão failover: khi kênh chính rung tức thời, hai bên cùng dò và làm quá tải kênh dự phòng. Thêm giới hạn tần suất phía client + backoff thì dịu lại.
Bước tiếp theo
Kênh kép đã giải quyết sự cố một nhà cung cấp. Nhưng chúng tôi vẫn phụ thuộc vào một lối ra mạng duy nhất, một tài khoản thanh toán duy nhất, một region duy nhất. Mục tiếp theo trong lộ trình là mở rộng cách ly sang các tầng này — sẽ viết một bài khi triển khai xong.