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

Анатомия игровых лагов › L13 Архитектура и эксплуатация серверов

Каскадный отказ Cascading failure

ID причины in-cascade · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Сетевая инфраструктура

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Когда один сервис тормозит, вызывающие его серверы зависают в ожидании ответа, и останавливаются даже функции, которые с ним не связаны.

Почему Тормозит один сервис, например БД или авторизация → Следствие Потоки и соединения вызывающих серверов заняты ожиданием ответа, а повторные попытки неудачных запросов добавляют нагрузку → На экране Тормозят или останавливаются даже функции, которые кажутся никак не связанными

Симптомы
Фриз, Задержка ввода, Ошибка входа / бесконечная загрузка
Факторы
Остановка
У кого
Весь сервер
Когда
При наплыве игроков, Изредка, случайно
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Сетевая инфраструктура
Команда разработки: задачи
Ставить таймауты на все вызовы, использовать circuit breaker (предохранитель для вызовов) и изоляцию функций друг от друга (bulkhead), повторять с растущим интервалом и ограничением числа попыток, отделить ответы на health check от тяжёлой работы.
Команда инфраструктуры: задачи
Дать запас по числу неудач и интервалу health check балансировщика, чтобы ненадолго притормозивший сервер не выводился сразу, и ограничить число серверов, выводимых одновременно.
На графике
Упор в лимит (плато) · время ответа и доля ошибок по сервисам, число занятых потоков и соединений
Где смотреть
Вывести на один экран с общей шкалой времени время ответа, долю ошибок и число повторов по сервисам и найти место, которое замедлилось первым. За балансировщиком смотреть время ответа целевых серверов (в AWS ALB это TargetResponseTime), число ответов 5xx от них (HTTPCode_Target_5XX_Count) и число целевых серверов, выведенных как неисправные (UnHealthyHostCount)
Подтверждает
Сначала растёт задержка одного сервиса, затем у вызывающих его сторон число занятых потоков и соединений упирается в лимит, ошибки переходят на другие сервисы, а вместе с ними растут число повторов и число выведенных целевых серверов
Опровергает
Если несколько сервисов замедлились в один и тот же момент, сначала проверить сбой общего ресурса (БД, сеть, хост)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Health check (проверка, жив ли сервер) тоже раскручивает каскад. Если занятый сервер отвечает на проверку с опозданием, балансировщик выводит исправный сервер из ротации, его трафик уходит на оставшиеся, и следующий сервер тоже начинает опаздывать с ответами.
Реальные инциденты
Riot Games 2020: Перегрузка edge-хоста на серверах League of Legends в Европе и Бразилии
Riot Games 2021: Сбой League of Legends EUW на 5 часов: одна второстепенная БД остановила весь сервер
Roblox 2021: Сбой Roblox на 73 часа: конкуренция в кластере service discovery (Consul)
AWS 2021: Перегрузка внутренней сети AWS us-east-1
AWS 2025: Сбой DNS DynamoDB в AWS us-east-1 и долгое восстановление

Источники

  1. Site Reliability Engineering, Chapter 22: Addressing Cascading Failures Google
    Перегруженный сервер не проходит health check и выводится, нагрузка ложится на оставшиеся, а повторы её усиливают. Рекомендуются лимит повторов, экспоненциальная задержка повтора со случайным разбросом и дедлайны
  2. Circuit Breaker Pattern Microsoft Azure
    Запросы, которые висят до таймаута, держат потоки и соединения с БД, и из-за этого отказывают даже не связанные функции. Если за заданное время накопилось слишком много неудач, вызовы сразу отклоняются
  3. Timeouts, retries, and backoff with jitter AWS
    Amazon Builders' Library. В цепочке из 5 вызовов при 3 повторах на каждом уровне нагрузка на БД вырастает в 243 раза. Повторять нужно только в одном месте и ограничивать повторы через token bucket
  4. CloudWatch metrics for your Application Load Balancer AWS
    TargetResponseTime (время от выхода запроса из балансировщика до начала ответа целевого сервера), HTTPCode_Target_5XX_Count (число ответов 5xx от целевых серверов), UnHealthyHostCount (число неисправных целевых серверов)

Смотрите также

Тот же слой: L13 Архитектура и эксплуатация серверов

Причины с тем же симптомом (Фриз) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами