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

  1. 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 /organizations bị gọi nhiều lần mỗi lần render, kể cả retry khi lỗi.
  2. 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.
  3. Ứ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.
  4. 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.
  5. 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