한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 Lag 白皮書 › L13 伺服器架構與維運

連鎖故障 Cascading failure

原因 ID in-cascade · 主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(網路基礎設施)

在含圖解與實驗的完整版中開啟卡片 →

一個服務變慢時,呼叫它的伺服器會卡在等待回應,連不相關的功能也跟著停擺。

為什麼 DB、認證等某一個服務變慢 → 於是 呼叫端伺服器的執行緒與連線卡在等待回應,失敗請求的重試又加重負載 → 畫面上 看似無關的功能也全部變慢或停擺

症狀
定格, 輸入延遲, 連不上/無限讀取
因素
停滯
誰會遇到
整個伺服器
何時
人潮湧入時, 偶爾隨機發生
負責單位
主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(網路基礎設施)
遊戲開發團隊要做的事
所有呼叫都設逾時、斷路器、依功能隔離(bulkhead),重試要逐步拉長間隔並限制次數,健康檢查的回應與忙碌的工作分開處理。
基礎設施團隊要做的事
負載平衡器的健康檢查在失敗次數與間隔上保留餘裕,避免把只是暫時變慢的伺服器立刻移出;限制同時移出的伺服器數量。
圖表上
碰到上限後持平 · 各服務的回應時間與錯誤率、執行緒與連線使用數
查看位置
把各服務的回應時間、錯誤率、重試次數對齊時間軸放在同一個畫面,找出最先變慢的地方。若在負載平衡器後方,看目標回應時間(AWS ALB 為 TargetResponseTime)、目標的 5xx 數(HTTPCode_Target_5XX_Count)、判定異常而移出的目標數(UnHealthyHostCount)
符合的跡象
某個服務的延遲先上升,接著呼叫該服務一方的執行緒、連線使用數貼齊上限,錯誤擴散到其他服務,重試次數與移出的目標數一起增加
不符合的跡象
多個服務在同一瞬間一起變慢時,先查共用資源(DB、網路、主機)的故障
確認方式
用基礎設施工具確認(不需要遊戲程式碼)
深入了解
健康檢查(確認伺服器是否存活的檢查)也會讓連鎖擴大。忙碌的伺服器太晚回應檢查時,負載平衡器會把其實正常的伺服器移出,它的流量湧向剩下的伺服器,下一台伺服器也跟著變慢。
實際案例
Riot Games 2020: League of Legends 歐洲、巴西伺服器的邊緣主機過載
Riot Games 2021: League of Legends EUW 5 小時事故:一個附屬 DB 讓整個伺服器停擺
Roblox 2021: Roblox 73 小時事故:服務探索(Consul)叢集的資源競爭
AWS 2021: AWS us-east-1 內部網路壅塞
AWS 2025: AWS us-east-1 DynamoDB DNS 事故與漫長的復原

出處

  1. Site Reliability Engineering, Chapter 22: Addressing Cascading Failures Google
    過載的伺服器健康檢查失敗被移出後,負載集中到剩下的伺服器,重試又放大負載;建議限制重試次數、使用隨機化的指數退避並設定截止時間(deadline)
  2. Circuit Breaker Pattern Microsoft Azure
    卡到逾時的請求占用執行緒與 DB 連線,讓不相關的功能也失敗;一定時間內失敗累積時直接拒絕呼叫
  3. Timeouts, retries, and backoff with jitter AWS
    Amazon Builders' Library。5 層呼叫中每層各重試 3 次,DB 負載會變成 243 倍;只在一個地方重試,並用 token bucket 限制
  4. CloudWatch metrics for your Application Load Balancer AWS
    TargetResponseTime(請求離開負載平衡器到目標開始回應所花的時間)、HTTPCode_Target_5XX_Count(目標產生的 5xx 數)、UnHealthyHostCount(異常目標數)

相關原因

同一層:L13 伺服器架構與維運

同一症狀(定格)在其他層的原因

查看含圖解與實驗的完整版卡片