Discord 語音服務中斷事後分析:Kubernetes 縮容觸發的三階段級聯失效
Discord Engineering Blog · 2026-05
Discord 於 2026 年 3 月 25 日發生語音服務全面中斷,持續約 3 小時 17 分鐘。事後分析揭示:一次 Kubernetes 遷移期間的設定更新意外終止 us-east1-b 區域 50% 的 session 管理 Pod,觸發了從 gateway 到 voice syncer 的三階段級聯失效。
原本的問題
Kubernetes 縮容操作的安全機制設計為「等待進行中的事件完成後再終止 Pod」,但當終止寬限期(termination grace period)在等待過程中到期,Pod 在未完成 session handoff 的情況下強制終止,導致 17% 的總 session 量非正常斷開,集中在 us-east1-b 區域。
採用的方法:三階段失效鏈
第一階段:Session 大量斷開觸發重連,集中湧入 us-east1-b gateway 節點。速率限制(rate limit)在 Kubernetes 遷移後未重新校準,允許的並發 session 啟動量超過 gateway 的記憶體上限,導致 gateway 程序重啟。
第二階段:數百萬 session 重連同時觸發 voice state 更新,voice syncer 服務接收大量出站 HTTPS 請求。這些連線透過 Holster 函式庫中的兩個 Erlang supervisor 程序路由,而這兩個 supervisor 本質上是單一 GenServer 程序,每次產生子程序需執行一次 selective receive 等待 ACK,毫秒級的延遲疊加造成信箱(mailbox)積壓至約 100 萬則訊息。
第三階段:etcd 服務發現的連線也通過相同的 supervisor 瓶頸,導致 voice syncer 實例的 TTL(60 秒)到期後從 hash ring 中脫落,15 個 voice syncer 實例相繼失去服務發現能力,25,000+ SFU 實例無法建立新通話。
實際效果與修正
修復方案分三層:即時——對 call owner 服務部署速率限制,逐一重啟 voice syncer 實例,新增 15 個實例將叢集容量翻倍。架構——以 PartitionSupervisor 取代 Holster.Pool 的單一 GenServer 架構,讓連線池可以並行存取;將 gun 連線生命週期管理直接移入 Holster.Pool,移除 gun supervisor 瓶頸。Kubernetes——新增 validating admissions webhook,強制縮容前完成 Pod graceful drain。
原始來源:You've Got (Too Much) Mail: Behind the Scenes of the 3/25/26 Voice Outage (Discord)
Discord 指標精簡實驗:從 50 個指標縮減到 15 個,統計功效提升 45%
Discord Engineering Blog · 2026-05
Discord 的資料科學團隊記錄了一項反直覺的發現:將實驗評估指標從約 50 個縮減至約 15 個,真實效應的偵測率(recall)提升了 45%。問題根源在於多重假設檢定的統計功效損耗,而非數據不足。
原本的問題
Discord 的 A/B 實驗系統使用 Benjamini-Hochberg(BH)校正控制 False Discovery Rate(FDR ≤ 5%)。BH 校正的調整係數與指標數量正相關——50 個指標的實驗中,每個指標的有效顯著性閾值被壓縮至遠低於 0.05,導致中等效應量(moderate effect size)的真實改動無法達到統計顯著性。透過 50,000 次模擬實驗,團隊確認了這個問題的規模。
精簡方法
主成分分析(PCA)顯示,50 個指標的 PC1 可解釋 約 63% 的變異量,意味著大量指標攜帶高度冗余資訊。團隊的精簡策略:
- 相關性分析:移除相關係數 0.73–0.92 的高度相關指標對,只保留概念最清晰的一個。
- 觀察視窗標準化:統一 1-day、14-day、30-day 三種版本為 7-day,消除人為分裂的指標版本。
- 業務相關性驗證:每個留下的指標必須通過跨團隊的業務意義審查。
實際效果
精簡後的 15 個指標在模擬實驗中對中等效應量的偵測率提升 45%,同時 FDR 維持在 5% 以下。工程師在 on-call 期間只需熟悉 一種查詢語言(PromQL)與 15 個指標,而非在 50 個指標與多個儀表板之間切換。Discord 計畫進一步研究 Empirical Bayes 方法,在歷史實驗資料作為先驗分佈的情況下進一步提升小效應的偵測能力。
原始來源:Measure Less to Learn More: Using Fewer, Higher-quality Metrics to Capture What Matters (Discord)