A deep dive into Cloudflare's September 12, 2025 dashboard and API outage
Bài tóm tắt Cloudflare 2025 3. Quy mô lớn Độ khó: Dễ
Cloudflare · 2025 · 3. Quy mô lớn · Độ khó: Dễ — bài gốc
Bối cảnh
- Tenant Service (Go, chạy trên Kubernetes ở một số data center) nằm trong logic phân quyền của mọi API request. Nó không đánh giá được quyền thì API trả 5xx.
- 12/9/2025: dashboard bị ảnh hưởng nặng trong khoảng 17:57–19:12 UTC, API sập hai đợt.
Diễn biến
- 16:32: bản dashboard mới có bug. Một object nằm trong dependency array của React
useEffectđược tạo lại sau mỗi lần render, nên API/organizationsbị gọi nhiều lần mỗi lần render, kể cả retry khi lỗi. - 17:50: một phiên bản mới của Tenant Service được deploy. Hai thay đổi chồng lên nhau, và 17:57 service bị quá tải và không tự hồi phục.
- Ứng phó: đặt rate limit toàn cục, tăng số pod. API lên 98% nhưng dashboard vẫn chưa hồi phục.
- 18:58: vá Tenant Service bằng cách bỏ vài đường code lỗi. Bản vá làm hỏng thêm, API sập đợt hai. Thêm một rate limit tạm.
- 19:12: revert bản vá, dashboard về 100%.
Thay đổi chính (sau postmortem)
- Argo Rollouts (theo dõi lỗi lúc deploy và tự rollback): Cloudflare đang chuyển dần các service sang; Tenant Service chưa được chuyển. Nếu đã có thì đợt sập thứ hai đã tự rollback. Việc này được nâng ưu tiên.
- Thundering herd khi khởi động lại: restart Tenant Service khiến mọi dashboard cùng xác thực lại một lúc, bị bug khuếch đại. Họ hotfix bug và thêm độ trễ ngẫu nhiên (jitter) cho retry phía dashboard.
- Cấp thêm nhiều tài nguyên cho Tenant Service; cảnh báo trước khi chạm trần.
- Phân biệt request retry với request mới: lúc sự cố không biết traffic tăng là do retry hay do request mới, trong khi biết được thì sẽ đoán ra ngay là vòng lặp ở dashboard. Dashboard sẽ gửi kèm thông tin này.
Điều đã giúp giảm thiệt hại
Đây là lỗi ở control plane, vốn tách bạch với data plane, nên mạng của Cloudflare không bị ảnh hưởng; chỉ user đang đổi cấu hình hoặc dùng dashboard bị ảnh hưởng. Cảnh báo tự động gọi đúng người.
Bài học cho SWE
- Bug ở client có thể DDoS chính backend của mình. Retry không có jitter và vòng lặp render là thứ khuếch đại.
- Một service nằm trên đường phân quyền là phụ thuộc cứng của mọi API, nên cần cấp dư và giới hạn tốc độ.
- Vá trong lúc sự cố có thể làm tệ hơn; revert thường an toàn hơn. Rollback tự động (Argo Rollouts) giảm được rủi ro này. Cùng công cụ với Monzo (Monzo 2022).
- Giống Discord 2026 (Discord 2026): khôi phục (restart) tạo ra thundering herd mới.
- Tách control plane khỏi data plane giới hạn được thiệt hại.
Liên quan
Hot partition và thundering herdDeploy và release an toànĐộ tin cậy và multi-regionSự cố và postmortemLoad shedding, rate limit và backpressureXác thực và phân quyền (authn/authz)Multi-tenancy và cô lập tenant
Được nhắc tới trong
Chủ đề (8)
Công ty (1)