GrabDuck

Как мы строили облачный бэкенд для мобильного шутера

:

Привет, Хабр! Совсем недавно мы запустили в России и еще нескольких странах многопользовательский мобильный шутер Guns Of Boom, который уже скачало более полумиллиона человек. Для обеспечения плавной и бесперебойной игры такого количества пользователей нужен хороший бэкенд. В этой статье мы расскажем, почему мы решили использовать для этого облако, и кратко опишем особенности построения бэкенда на основе облачных сервисов.



В целом, облачные сервисы имеют ряд неоспоримых преимуществ перед классическим бэкендом в виде работающего в подвале у разработчика сервера. В отличие от стационарных серверов, число которых невозможно резко увеличить или сократить (игра не популярна, “не сезон” и оборудование простаивает), они могут включать и выключать дополнительные мощности автоматически, в зависимости от нагрузки.

Два основных преимущества облака, помогающие понять его глубинную суть (тм) — обеспечение избыточности и скорости масштабирования. Под скоростью масштабирования здесь подразумевается возможность быстро обеспечить дополнительные аппаратные ресурсы при резком увеличении числа пользователей, а при уменьшении — сократить расход серверного времени и сэкономить деньги и ресурсы.

В случае с избыточностью речь идет об автоматическом дублировании ресурсов игры, данных или аппаратных систем в облаке. Чаще всего избыточность обеспечивается хранением одинакового набора данных на нескольких серверах в пределах одного или нескольких дата-центров в пределах одной географии. Это нужно для экстренного восстановления при сбоях, обеспечения автоматического аварийного переключения на доступные сервера и защиты от DDOS-атак.

Так как мы говорим о создании онлайн-шутера, очень важно обеспечить низкую задержку в передаче данных. Как минимум четверть от всех пользователей играет в Guns of Boom через 3G/4G, и для плавного геймплея нужна задержка, не превышающая 100 миллисекунд. Ролик выше иллюстрирует динамику игры, которую необходимо обеспечивать и поддерживать на качественном уровне для каждого игрока в любой точке света.

Во-первых, это обеспечивается автоматическим подключением игрока к ближайшему серверу, расположенному, как правило, в том же географическом регионе. Во-вторых, для обеспечения максимальной производительности и плавности мы используем сессионные и мета-сервера. Мета-сервера — подмножество реалтаймовых сервисов, которые мы для простоты понимания объединили в одну роль, некритичную по расположению для геймплея. В какой-то момент мы рассматривали использование модели микро-сервисов, но в итоге не нашли значительных преимуществ и остановились на текущем варианте.

К мета-серверу игровой клиент обращается для авторизации и синхронизации данных, это соединение является постоянным и не разрывается во время игровой сессии. Обычно в шутерах стараются этого избежать, но с текущим уровнем нагрузки мы решили, что этот подход оправдывает себя. Кроме прочего, именно мета-сервер решает, к какому сессионному серверу в каждый момент времени будет подключен клиент. Непосредственно игровая сессия происходит, как подсказывает название, на сессионном сервере.

Благодаря использованию облака мы получаем возможность автоматически масштабировать инфраструктуру и потреблять только то количество ресурсов, которое требуется в текущий момент. Облако легко может предоставить большее количество аппаратных ресурсов (CPU, оперативная памяти, интернет-канал) для обработки возросшего числа пользователей и, соответственно, игровых сессий.

Масштабирование работает и в обратную сторону. В Guns of Boom игровые сессии длятся по 5 минут для 8 одновременно подключенных игроков. Когда игрок отключается от сессионного сервера, нагрузка снижается. Если на сервере запущено меньше 4 боевых сессий (т.е. подключено менее 32 человек), он становится недоступным для клиента игры. Как только все сессии на таком сервере заканчиваются, игроки с него перенаправляются на другие сессионные сервера со свободными слотами, а текущий сервер помечается как неактивный.

Когда мы принимали решение об использовании облака в Guns of Boom, мы сформулировали такие требования к нему:

  • Поддержка основных *nix систем «из коробки»;
  • Поддержка собственных образов;
  • Поддержка гибридной инфраструктуры;
  • Поддержка статических внешних айпи;
  • Поддержка CDN;
  • Поддержка автомасштабирования по задаваемым параметрам (с учетом скорости развертывания);
  • Высокий SLA;
  • Поддержка ВМ различных конфигураций;
  • Поддержка внутренних и внешних балансировщиков нагрузки;
  • Поддержка сервисов и контейнеров;
  • Поддержка инструментов CLI и оркестрации;
  • Наличие реализованных игровых проектов;
  • Наличие ЦОДов на разных континентах.

При этом важно было использовать платформу, уже зарекомендовавшую себя в запуске индустриальных проектов похожего масштаба. Таким образом, для Guns of Boom была выбрана Amazon Web Services.

Следующим этапом выбора стал вопрос сайзинга инфраструктуры и типов виртуальных машин, которые будут использованы в качестве основы. После долгого тестирования, мы остановились на c4.xlarge машинах в качестве основной платформы для большинства сервисов и c4.4xlarge для серверов с боевыми сессиями.

Одним из основных факторов выбора для нас была бесперебойная и быстрая работа сетевой подсистемы, а также большой запас оперативной памяти. Это оказалось важным при масштабировании, т.к. при оптимизации качества и переносе всех ресурсов в оперативную память (и отключении использования файла подкачки), у нас должен гарантированно оставаться запас даже при большой нагрузке на сервер.

AWS, со своей стороны, подготовил нам несколько сюрпризов, к которым мы оказались не вполне готовы. К примеру, сетевая подсистема, не смотря на Enchanced Networking от Amazon, оказалась не так проста. Все началось с того, что под нагрузкой у нескольких боевых серверов разом отказала сеть, что привело к серьезным проблемам в работе кластера, отключением части узлов, а вместе с ними и игроков.

После внутреннего расследования, причины сбоя в архитектуре бэкенда так и не нашлись (логи чистые, в консоли ошибок нет), зато после привлечения Amazon Premium Support, выяснилось, что это маловероятный, но допустимый вариант поведения виртуальных машин в маленьком проценте случаев, не выбивающийся из заявленного SLA. После этого нам пришлось оптимизировать архитектуру для обеспечения отказоустойчивости в том числе при аппаратных сбоях облачной инфраструктуры.

Таким образом, облачные сервисы с красивым SLA тоже не решают всех ваших проблем и несут в себе дополнительные риски, которые нужно учитывать.

Сейчас игра находится на софт-лонче в нескольких странах с более чем полумиллионом установок. Перед запуском по всему миру мы должны убедиться, что бэкенд выдержит и правильно отмасштабируется, обеспечивая позитивный пользовательский опыт для миллионов игроков.

К сожалению, многие онлайн-игры на старте испытывают критические сложности с бэкендом сразу после запуска и набором некоторой критической массы онлайна. Из последних таких примеров — Pokemon GO, Tom Clancy's The Division и Total War: Warhammer.

На данный момент перечисленные выше функции реализованы не идеально, но мы продолжаем совершенствовать клиент-серверные протоколы связи, чтобы снизить нагрузку на сеть и уменьшить задержки. Используя географию инфраструктуры облачных дата-центров Amazon, мы активно улучшаем гео-распределенную архитектуру, чтобы все могли играть в Guns of Boom одинаково комфортно. И только после успешного выполнения всех этих пунктов можно будет запускать Guns of Boom на весь мир, осчастливив всех игроков, которые его ждут. И мы об этом тоже обязательно расскажем.