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

ゲームラグ白書 › L13 サーバー構成と運用

カスケード障害 Cascading failure

原因ID in-cascade · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・ネットワークインフラ

図と実験のあるメインページでこのカードを開く →

1つのサービスが遅くなると、それを呼び出すサーバーが応答待ちで塞がり、関係のない機能まで止まります。

なぜ DB・認証など1つのサービスが遅くなる → すると 呼び出し側サーバーのスレッドと接続が応答待ちで塞がり、失敗したリクエストの再試行が負荷を上乗せ → 画面では 関係なさそうな機能まで、すべて遅くなるか止まる

症状
フリーズ, 入力遅延, 接続不可・無限ロード
要因
ストール
誰に起きるか
サーバー全体
いつ
人が集中したとき, ときどきランダムに
担当
主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・ネットワークインフラ
ゲーム開発チームの対応
すべての呼び出しにタイムアウト、サーキットブレーカー、機能ごとの隔離(バルクヘッド)、再試行は間隔を広げながら回数を制限、ヘルスチェックの応答は重い処理と分離。
インフラチームの対応
ロードバランサーのヘルスチェックが一時的に遅いだけのサーバーをすぐ外さないよう、失敗回数・間隔に余裕を持たせる、一度に外れるサーバー数の制限。
グラフでは
上限で頭打ち · サービスごとの応答時間・エラー率、スレッド・コネクションの使用数
確認箇所
サービスごとの応答時間・エラー率・再試行回数を時間軸をそろえて1画面に並べ、最初に遅くなった箇所を探す。ロードバランサーの後ろなら、ターゲットの応答時間(AWS ALBではTargetResponseTime)、ターゲットの5xx数(HTTPCode_Target_5XX_Count)、異常として外れたターゲット数(UnHealthyHostCount)
該当する場合
1つのサービスの遅延が先に上がり、続いてそのサービスを呼び出す側のスレッド・コネクション使用数が上限に張り付き、エラーがほかのサービスへ広がり、再試行回数と外れたターゲット数も一緒に増える
該当しない場合
複数のサービスが同じ瞬間に一斉に遅くなったなら、共用リソース(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
    過負荷のサーバーがヘルスチェックに失敗して外れると残りのサーバーに負荷が集中し、再試行が負荷を増やす、再試行回数の制限・ランダム化した指数バックオフ・デッドラインを推奨
  2. Circuit Breaker Pattern Microsoft Azure
    タイムアウトまで詰まったリクエストがスレッド・DB接続を占有し、関係のない機能まで失敗させる、一定時間内に失敗がたまると呼び出しを即座に拒否
  3. Timeouts, retries, and backoff with jitter AWS
    Amazon Builders' Library。5段の呼び出しで各層が3回ずつ再試行するとDB負荷は243倍、再試行は1か所だけで行い、トークンバケットで制限
  4. CloudWatch metrics for your Application Load Balancer AWS
    TargetResponseTime(リクエストがロードバランサーを出てからターゲットが応答を開始するまでの時間)、HTTPCode_Target_5XX_Count(ターゲットが返した5xxの数)、UnHealthyHostCount(異常なターゲットの数)

あわせて読みたい原因

同じ層:L13 サーバー構成と運用

同じ症状(フリーズ)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る