ID причины dc-lb-idle · Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда разработки · Разработка клиента, Команда разработки · Разработка сервера
Балансировщик нагрузки удаляет неактивное соединение через определённое время. Игра считает, что соединение живо, и в итоге получает дисконнект.
Почему Игрок какое-то время не отправляет ни одного пакета (окно чата, отошёл от компьютера) → Следствие Балансировщик удаляет неактивное соединение (типичные значения по умолчанию 60–350 с) → На экране Дисконнект в момент, когда игрок снова начинает двигаться
Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда разработки · Разработка клиента, Команда разработки · Разработка сервера
Команда разработки: задачи
Клиент: слать хартбиты с интервалом не больше половины самого короткого таймаута простоя (за ALB с 60 с не реже раза в 30 с), при обрыве автоматически переподключаться. Сервер: отвечать на хартбиты и первым закрывать соединение, если их нет определённое время, подхватывать игрока по токену сессии.
Команда инфраструктуры: задачи
Проверить таймаут простоя балансировщиков на пути, сообщить значение команде разработки и при необходимости увеличить.
Цифры для ориентира
Значения по умолчанию: AWS ALB 60 с, NLB 350 с для TCP и 120 с для UDP, Azure Load Balancer 4 мин для TCP. Значения TCP у ALB и NLB можно изменить, а 120 с для UDP у NLB изменить нельзя. По истечении таймаута ALB закрывает и соединение со стороны сервера, а NLB удаляет его молча, и сервер часто об этом не знает.
На графике
Массовый обрыв соединений · число обрывов, время бездействия перед обрывом
Где смотреть
Проверить настройку таймаута простоя у балансировщиков на пути и собрать для каждого оборвавшегося соединения время от последнего пакета до обрыва. Для AWS NLB смотреть также TCP_ELB_Reset_Count в CloudWatch (число RST, отправленных балансировщиком)
Подтверждает
Время бездействия у оборвавшихся соединений скапливается сразу после настроенного значения (ALB 60 с, NLB 350 с для TCP и т. д.), и проблема воспроизводится, если простоять без действий дольше этого времени и затем двинуться. У NLB в этот момент растёт TCP_ELB_Reset_Count
Опровергает
Если обрывы не зависят от времени бездействия, причина в другом. Если на серверах без балансировщика обрывы скапливаются около 350 с, это «Истечение отслеживания соединений в облачной группе безопасности», если дело в домашнем роутере игрока, это «Истечение записи в таблице NAT»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
Edit attributes for your Application Load BalancerAWS Таймаут простоя ALB по умолчанию 60 с (1–4 000 с), если соединения с клиентом и с целевым сервером всё это время молчат, балансировщик закрывает соединение
Network Load BalancersAWS Таймаут простоя NLB для TCP по умолчанию 350 с (60–6 000 с), по его истечении NLB просто перестаёт отслеживать соединение и на последующие данные отвечает RST, 120 с для UDP-потоков изменить нельзя
Configure load balancer TCP reset and idle timeoutMicrosoft Azure Таймаут простоя Azure Load Balancer по умолчанию 4 мин (4–100 мин), после него сохранение сессии не гарантируется, отправка TCP reset включается отдельно