Canva incident report: API Gateway outage
Bài tóm tắt Canva 2024 3. Quy mô lớn Độ khó: Trung bình
Canva · 2024 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bối cảnh
- Editor của Canva là một SPA, deploy nhiều lần mỗi ngày; mỗi lần có hơn 100 file tĩnh mới lên S3 và được phát qua Cloudflare (tiered cache).
- API Gateway là cửa vào của mọi API (xác thực, phân quyền, rate limit): Java/Netty chạy event loop, autoscale trên ECS.
- 12/11/2024, khoảng 9:08–10:00 UTC: canva.com không truy cập được.
Diễn biến (chuỗi lỗi)
- 8:47: deploy bản editor mới. Cùng lúc, một luật định tuyến cũ ở Cloudflare đẩy traffic IPv6 Singapore–Ashburn qua đường public bị mất gói (đỉnh khoảng 66%). Một file JS (chunk của object panel) mất 20 phút mới tải xong.
- Cloudflare gộp request trùng cho cùng một asset vào một cache stream, nên hơn 270.000 request của user Đông Nam Á cùng chờ một luồng. Canary không phát hiện gì, vì request chưa xong thì không tính là lỗi.
- 9:07: asset tải xong, 270.000 request hoàn tất cùng lúc, object panel trên mọi máy cùng gọi API. Kết quả là thundering herd khoảng 1,5 triệu req/s, gấp 3 lần đỉnh thường.
- Một bug có sẵn: thư viện telemetry đăng ký lại metric mỗi lần ghi, dưới một lock trong thư viện bên thứ ba, nên event loop bị chặn và throughput mỗi task giảm mạnh. Bản sửa đã nằm trong quy trình release từ sáng nhưng bị đánh giá thấp nên chưa deploy gấp.
- Load balancer tiếp tục mở thêm kết nối tới task đang quá tải. Bộ nhớ off-heap tăng, OOM killer giết mọi container trong 2 phút, nhanh hơn tốc độ autoscale.
Khắc phục
- Scale tay số task: thất bại, vì task mới vừa healthy đã bị traffic đè chết.
- 9:29: chặn toàn bộ traffic ở CDN bằng firewall rule của Cloudflare (chuyển canva.com sang trang status) để task khởi động mà không bị đè.
- Mở lại dần: bắt đầu với user Úc dưới rate limit chặt, rồi tăng dần.
Thay đổi sau sự cố
- Runbook chặn, định tuyến lại và mở dần traffic.
- Tăng số task nền và bộ nhớ mỗi task; thêm luật load shedding ở API Gateway; load test định kỳ.
- Sửa bug telemetry, thêm microbenchmark đa luồng.
- Canary theo dõi thêm sự kiện "tải trang xong", không chỉ tỷ lệ lỗi JS; thêm một bậc rollout; thêm timeout khi tải asset.
- Theo Canva: họ viết incident report nội bộ cho mọi sự cố mức cao và trung bình từ 2017; đây là báo cáo công khai đầu tiên.
Bài học cho SWE
- Cơ chế gộp request (coalescing) cũng là cơ chế dồn request: khi luồng gốc kẹt, nó giữ hàng trăm nghìn request rồi thả ra cùng lúc. Đây là mặt trái của kỹ thuật chống thundering herd trong Cache và invalidation.
- Canary chỉ đo lỗi thì mù với request treo. Cần đo cả việc hoàn tất (page load). Xem Deploy và release an toàn.
- Khôi phục phải giảm cầu trước: thêm task khi traffic còn dồn chỉ làm task mới chết theo. Chặn ở CDN rồi mở dần là cách ra, giống bài học của Discord 2026 (Discord 2026).
- Đúng mẫu "thay đổi nhỏ + bộ khuếch đại + giới hạn ẩn" (Sự cố và postmortem): deploy thường lệ, mạng CDN lỗi, coalescing, bug lock trong telemetry.
Liên quan
Sự cố và postmortemHot partition và thundering herdDeploy và release an toànCache và invalidationLoad shedding, rate limit và backpressure
Được nhắc tới trong
Chủ đề (5)
Công ty (1)
Bài tóm tắt (3)