Если при перезапуске сервера ради обновления не перенести соединения, у всех игроков на этом сервере будет дисконнект, а сохранения перед остановкой и переподключения придут разом.
Почему Серверы по очереди перезапускаются при деплое хотфикса → Следствие Сервер останавливается без переноса соединений на другой, и сохранения всех игроков с этого сервера разом идут в БД → На экране Дисконнект без предупреждения, лавина переподключений
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура
Команда разработки: задачи
Сделать drain (закрыть только новые подключения и ждать, пока уйдут текущие игроки), переносить персонажей на другой сервер, растягивать сохранения перед остановкой, после перезапуска объявлять готовность только после загрузки кэша и прогрева JIT, при горячей перезагрузке заранее читать данные в отдельном потоке и подменять их разом между тиками.
Команда инфраструктуры: задачи
Настроить деплой так, чтобы серверы перезапускались по одному после drain, а перезапущенный сервер получал трафик только после подтверждения готовности (прогрев завершён), заранее объявлять время деплоя.
Цифры для ориентира
Если на одном сервере 5 000 игроков, за несколько секунд до остановки в БД приходят 5 000 сохранений.
На графике
Массовый обрыв соединений · число подключений по серверам, число записей в БД
Где смотреть
Наложить журнал деплой-инструмента (время перезапуска каждого сервера) вертикальными линиями (аннотациями) на графики числа подключений, обрывов, записей в БД и запросов на вход
Подтверждает
Число подключений на серверах по очереди резко падает в моменты перезапуска, прямо перед этим подскакивают записи в БД, сразу после него запросы на вход
Опровергает
Если время обрывов не совпадает с журналом деплоя и перезапусков, причина в падении сервера или в сетевом оборудовании
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Первые несколько минут после запуска сервер тоже работает медленно. Кэш пуст, и запросы к БД идут лавиной, а серверы на Java и C# ещё не закончили оптимизацию кода во время выполнения (прогрев JIT), поэтому та же работа занимает больше времени. Перечитывание скриптов и таблиц данных без остановки сервера (горячая перезагрузка) тоже останавливает тик на время чтения и даёт короткий фриз.
Источники
Site Reliability Engineering, Chapter 20: Load Balancing in the DatacenterGoogle Получив SIGTERM, сервер переходит в состояние lame duck: отправляет новые запросы на другие серверы и только завершает текущие. В первые минуты после перезапуска JIT-оптимизация ещё не выполнена и ресурсов уходит больше, поэтому трафик дают только после прогрева
Liveness, Readiness, and Startup ProbesKubernetes Проверка готовности (readiness) не пускает трафик, пока не установлены соединения, не загружены файлы и не прогрет кэш