Сетевое цунами — почему серверы постоянно ломаются под наплывом игроков
Недавно Destiny 2 пережила второе рождение: основа игры стала условно-бесплатной, а версия для PC переехала из Battle.net в Steam. Ажиотаж стоял нешуточный: на площадке Valve количество одновременно играющих мигом перемахнуло за 200 тысяч — серверы Destiny 2 такого наплыва не выдержали.
Эта история, кажется, повторяется с каждой крупной онлайн-игрой: войти в неё в час релиза или сразу после запуска значимого обновления почти невозможно. Но почему разработчики с завидным упорством наступают на эти грабли? Почему они, как часто пишут обычные игроки, просто не добавят серверов на время наплыва? Что в этом такого сложного?
Kotaku провёл небольшое расследование, чтобы разобраться в вопросе.
Рельсы, рельсы, шпалы, шпалы
Сайт поговорил на тему перегрузок с Рами Измаилом (Rami Ismail) — независимым разработчиком и большим любителем Destiny. По его словам, проблемы с запуском действительно могут быть связаны с недостатком серверов: сетевой инфраструктуре не хватает компьютеров, чтобы справиться со всеми сигналами соединения, которые генерируют игроки при входе. «Представьте железнодорожную станцию, у которой не хватает путей на все поезда», — проводит сравнение Измаил.
Однако изъян может таиться и в клиенте, установленном на компьютере или консоли геймера. Например, из-за бага игра отсылает избыточный объём данных на сервер. «Как будто на станции хватает путей, но туда прибывает слишком много незапланированных поездов», — продолжает аналогию разработчик.
Третья теория Измаила — слабое звено в коде серверов, из-за которого замедляется скорость обработки данных с устройств игроков. «На станции достаточно поездов и путей, но каждому пассажиру, который выходит на платформу, нужно заполнить специальный документ или вроде того», — возвращается к железнодорожной теме Измаил.
Четвёртая версия — код или сервер сторонней компании, который участвует в процессе, но непосредственно над ним разработчики игры не властны: «Чужая станция на границе пропускает слишком мало поездов, поэтому людям на нашей станции приходится долго ждать».
Любое из перечисленных препятствий может вызвать падение серверов, рассказывает Измаил. «Это распространённая проблема, поэтому излишнюю нагрузку начинают распределять по соседним ядрам или серверам. Вот наша станция перенаправляет поезда или пассажиров на другие станции, которые и так полностью заняты. Теперь они тоже перегружены, а сложность зацепила все станции. Некоторые из них закрываются, некоторые не могут принимать ещё больше поездов».
Готовиться к любой из этих ситуаций трудно, уверяет Измаил. Да, можно проводить предварительные испытания, но ничто не передаст нагрузку от реального наплыва игроков. «Обычно всю систему получается оценить, лишь когда поезда начинают ездить по-настоящему. Предположим, поезд от станции А прибывает на станцию Д на два процента медленнее, чем рассчитывали. На станции Д начинается медленное накопление — до тех пор, пока не возникнет ошибка».
Эффект бабочки
Все разработчики, с которыми беседовал Kotaku, скептически относились к предположению, что онлайн-игры плохо стартуют из-за недостатка серверов. Сейчас популярные провайдеры вроде Amazon, Google и Microsoft позволяют довольно легко добавить больше машин. Их всегда хватает, утверждают собеседники сайта.
У крупных компаний есть деньги на то, чтобы увеличить число серверов при необходимости. «Когда у огромной игры плохой запуск, обычно это не связано с нехваткой сетевых машин, — рассказывает разработчик Джош Лин (Josh Ling). — Машины есть, но проблемы вызывает программная начинка: „краши“, отказы системы и так далее».
Дрю Талер (Drew Thaler) — разработчик, который четыре года трудился в Naughty Dog и занимался запуском и обслуживанием мультиплеера в Uncharted и The Last of Us. Сейчас он возглавляет компанию Mesh и предоставляет сетевые сервисы. Как вспоминает Талер, Naughty Dog столкнулась со сложностями в многопользовательской части, даже когда портировала The Last of Us с PlayStation 3 на PlayStation 4. Версии игры были почти одинаковыми, однако некая технология Sony, которую использовала команда, ранее не применялась в столь широком масштабе, поэтому привела к осложнениям.
«Для пользователей это выглядело так, будто происходит долгий матчмейкинг, — делится Талер. — Игровой код формировал матч, а затем некоторые люди не могли напрямую подключиться друг к другу, из-за чего матч отменялся». Naughty Dog смастерила костыль, при помощи которого ошибку обходили, но источник программной заразы студия обнаружила лишь спустя несколько месяцев. Он крылся в маленьком куске кода — «стеке SSL в реализации Java» (надеемся, хоть кто-то понял, о чём речь!).
Казалось, что этот кусок не может настолько сильно повлиять на матчмейкинг, но произошло именно это. «Как будто Google Maps на телефоне показывает неверные направления из-за плохой электропроводки у вас дома», — сравнивает Талер.
После этого Naughty Dog взялась запускать мультиплеер Uncharted 4: A Thief’s End. По меркам студии он был амбициозным: больше игроков в матче, напарники под управлением ИИ, виртуальная валюта и так далее. Всему этому добру требовался новый код. «Здесь и возникает особенно много проблем, — говорит Талер. — В тестах система работает великолепно, даже в симуляции нескольких тысяч человек одновременно. Но вот в первый час, когда в игру пытается зайти сразу сотня тысяч…»
«Сетевые сервисы — это не просто сервер. Это сложная система. Этот сервер отвечает за матчмейкинг, этот — за очереди, этот получает записи событий, этот делает туннелирование NAT, этот узнаёт местоположение игроков для улучшенного соединения, этот заправляет списками лидеров, этот — аутентификацией, а этот — виртуальной валютой. Он должен быть особенно устойчивым, чтобы не терять транзакции и кредиты», — поясняет Талер. Дрогнуть может любое звено цепи.
Смертоносная ёлочка
The Last of Us для PlayStation 4 — более-менее лёгкий проект для разработчиков, ведь по сравнению с версией для PlayStation 3 изменений в коде было относительно немного. Но даже в этом проекте появились затруднения. А теперь представьте, что будет, если девелоперы постоянно вводят что-то новое или много экспериментируют.
Катастрофой может обернуться даже крохотная косметическая особенность. Как-то раз гейм-дизайнер Раф Костер (Raph Koster) вспоминал историю из жизни Ultima Online. Однажды команда захотела подарить всем игрокам праздничную ель в честь наступающего Рождества. У разработчиков не было готовых ассетов для ёлки, поэтому Костер решил схитрить. Он взял обычную ель и написал для неё скрипт, чтобы на ней возникли маленькие самоцветы. У всех самоцветов был ещё один скрипт с обратным вызовом (callback), который заставлял драгоценность появляться и исчезать. Выглядело, словно на дереве мигают украшения.
На Рождество ёлочку дали всем, кто зашёл в игру. Так в Ultima Online посадили тысячи новых деревьев. У каждого дерева — двадцать обратных вызовов с интервалом примерно в одну секунду. Очередь записей оказалась перегружена на всех серверах, после чего сервис полностью отвалился.
Ultima Online обвалилась в Рождество — период выходных, когда игроки хотят играть, а разработчики отдыхают с семьями и не готовы к таким масштабным авралам. И всё из-за скромного подарка!
Ещё один пример неожиданностей в сетевом коде случился в The Division 2. Игра прошла бета-тестирование, однако спустя несколько дней после релиза пользователи столкнулись с неприятностью: их турели, дроны и другие схожие умения уничтожались сразу после активации.
Разработчики обнаружили, что серверы барахлят из-за накопления статусных эффектов, связанных с игровыми умениями. По всей видимости, эта программная дыра была в The Division 2 с самого начала, однако суммировалась постепенно и разорвалась лишь тогда, когда через шутер прошло много игроков. Ошибку залатали довольно быстро, но засечь её заранее не получилось.
Многие накопленные проблемы дают о себе знать лишь при большой нагрузке. Быть может, поэтому и рухнула Destiny 2, когда запустилась условно-бесплатная версия. В игру попытались попасть огромные толпы геймеров — вероятно, они были намного больше того, с чем сталкивались разработчики ранее.
Рассказывает Талер: «Когда AAA становится бесплатной, пользовательская база увеличивается в разы, что может стать неожиданностью для тех, кто не работает с условно-бесплатными играми. У нас был фритуплейный уикенд в Uncharted во время „беты“, и на наши серверы свалилась ноша в 10—20 раз больше обычной».
Собеседники Kotaku не считают, что сетевые болячки когда-нибудь получится вылечить полностью, но всегда можно минимизировать их число в будущем. Чем больше сетевых элементов в играх, тем больше опыта у разработчиков, благодаря чему они надёжнее строят инфраструктуру и быстрее устраняют ошибки.
Сторонние команды, к услугам которых прибегают девелоперы, тоже совершенствуются. Например, британская компания Multiplay помогала Electronic Arts и Respawn запускать Apex Legends. Напомним, что игра условно-бесплатная и стартовала одновременно с анонсом — а значит, и нагрузка на серверы была очень большой. Тем не менее Apex Legends удалось справиться с волной желающих.
Как пишет Kotaku, разработчиков выручают даже бета-тесты перед самым релизом, которые многим кажутся обыкновенным рекламным трюком.
Однако универсального лекарства не существует — девелоперам всё равно приходится пахать не покладая рук. «Нужно работать под гигантским давлением времени с крайними сроками до вчера. Потому что все хотят поиграть в любимую игру, но не могут этого сделать, пока вы не решите проблему», — заключает Талер.
Лучшие комментарии
А-а, то есть мигание обрабатывалось сервером???
Не удивительно что всё упало.
В титанопаде используется именно эта система — динамические сервера. Если нагрузка вырастает, то включаются ещё сервера, если игроков мало, то выключаются сервера.