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

в 9:25, , рубрики: Amazon Web Services, AWS, backend, cloud, Game Insight, guns of boom, Блог компании Game Insight, бэкенд, никто не читает теги, облако, разработка игр, разработка мобильных приложений

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

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

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

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

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

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

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

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

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

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

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

Когда мы принимали решение об использовании облака в 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 тоже не решают всех ваших проблем и несут в себе дополнительные риски, которые нужно учитывать.

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

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

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

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

Автор: Game Insight

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js