Хотите начать играть в Star Citizen? Никаких проблем -  Вы можете приобрести через меня  стартовый пакет с Авророй или Мустангом за  5500 р. при регистрации по моей реферальной ссылке (без рефералки - 6000 р.). Внимание! Сейчас доступен со скидкой 10% стартовый пакет с отличным Drake Cutter - цена по моей рефералке будет 6500 р. (без - 7000). Пишите через обратную связь или в личку дискорда (star_Smith). Возможно приобрести другие пакеты и корабли. Подробее о гарантиях

Server Meshing и Persistent Streaming: ответы разработчиков

Главная / Все разделы / Ответы разработчиков

В связи с тем, что мы все ближе к реализации самой главной сетевой технологии в игре, и уже начались тестирования одних из частей этой технологии - предлагаю вспомнить ответы разработчиков по Server Meshing и Persistent Streaming

Когда мы увидим Persistent Streaming и Server Meshing в PU?
 
Наша текущая цель - выпустить Persistent Streaming и первую версию слоя репликации, в идеале, между 1 и 2 кварталом следующего года. Затем, если не возникнет каких-либо непредвиденных технических сложностей, мы выпустим первую версию статической серверной сетки в третьем-четвертом кварталах следующего года.
 
Каково текущее состояние технологии Server Meshing и каковы наиболее серьезные проблемы, сдерживающие ее развитие?
 
Большинство людей, говоря о технологии Server Meshing, обычно имеют в виду последний этап, на котором мы "объединяем серверы". На самом деле перед этим шагом необходимо выполнить очень длинную цепочку предварительных требований и внести фундаментальные технологические изменения в наш игровой движок. Учитывая это, я постараюсь ответить на этот вопрос в контексте полной картины.
 
Короткий ответ: состояние на самом деле очень продвинутое.
 
Теперь длинная версия. Путь к Server Meshing начался еще в 2017/2018 году:
 
 
Потоковая передача объектных контейнеров
 
Для работы Server Meshing нам сначала потребовалась технология, позволяющая динамически связывать/развязывать сущности через систему потоков, поскольку на момент запуска движок этого не поддерживал. Поэтому, когда в 2018 году мы выпустили "потоковую передачу объектов-контейнеров на стороне клиента" (OCS), мы также сделали первый шаг к серверной сетке!
 
Как только этот первый шаг был сделан, технологию, позволяющую динамически связывать/развязывать сущности на клиенте, необходимо было включить и на сервере (поскольку в конечном итоге серверные узлы сетки должны будут динамически передавать сущности). Эта технология получила название "потоковая передача контейнеров объектов на стороне сервера" (S-OCS), и первая версия S-OCS была выпущена в конце 2019 года. Это стало следующим большим шагом на пути к Server Meshing.
 
Полномочия сущностей и передача полномочий
 
Хотя у нас была технология, позволяющая динамически перемещать сущности на сервере, по-прежнему существует только один единственный сервер, который "владеет" всеми моделируемыми сущностями. В сетке, где несколько серверных узлов разделяют моделирование, нам понадобилась концепция "полномочий сущности". Это означает, что любая конкретная сущность больше не принадлежит одному выделенному игровому серверу, вместо этого в сетке имеется несколько серверных узлов. То есть один серверный узел, который управляет сущностью, и несколько других серверных узлов, которые имеют клиентское представление об этой сущности. Этот орган также должен иметь возможность передачи между серверными узлами. В первой половине 2020 года концепции "полномочий сущности" и "передачи полномочий" было посвящено значительное количество времени. Это был первый случай, когда всей компании пришлось работать над Server Meshing, так как для работы с новой концепцией "сущность-авторитет" пришлось изменить большое количество игрового кода. К концу 2020 года большая часть кода (игрового) была изменена для поддержки этой концепции, так что был сделан еще один большой шаг, но реальной сетки пока не видно.
 
Слой репликации и постоянный поток
 
Следующим шагом стало перемещение репликации сущностей в центральное место, где мы можем управлять потоковой передачей и логикой сетевой привязки. Это позволит нам реплицировать состояние сети на несколько серверных узлов. Для этого нам пришлось перенести логику потоковой передачи и репликации из выделенного сервера в слой "Репликация", на котором теперь располагается код сетевой репликации и потоковой передачи сущностей.
 
В то же время мы реализовали функцию Persistent Streaming, которая позволяет слою Replication сохранять состояние сущностей в графовой базе данных, где хранится состояние каждой отдельной реплицируемой в сеть сущности. 2021 год был посвящен работе над слоем репликации и графом сущностей (EntityGraph), который позволяет управлять потоковой передачей и репликацией сущностей из отдельного процесса (отдельно от традиционного выделенного игрового сервера). Эта работа практически завершена и находится на финальной стадии.
 
Статические и динамические серверные сетки
 
Однако это еще не "сетка". Работа над реальной сеткой уже началась, и ее завершение займет весь следующий год, а все предварительные требования, которые я описал выше, были необходимы для того, чтобы добраться до этого момента. Первая версия этой технологии будет представлять собой статическую серверную сетку и является следующим большим шагом. Однако она также не будет последней! Со статической сеткой мы получим первую версию настоящей сетки, но, как видно из названия "статическая", возможности масштабирования этой сетки очень ограничены.
 
Прежде чем мы сможем назвать эту функцию полноценной, нам придется сделать еще один большой шаг, который мы называем "динамической сеткой". Этот шаг позволит нам динамически объединять серверные узлы в сетку и затем динамически масштабировать сетку в зависимости от потребностей. Большая часть работы над этой частью происходит параллельно. Например, уже разрабатывается менеджер флота, управляющий динамическим спросом на сетку, а также требования к организации матчей, связанные с новым включением "осколков".
 
В то же время многим командам разработчиков игрового кода приходится работать над адаптацией существующего игрового кода для полноценной работы с серверной сеткой (и, что более важно, находить все крайние случаи, которые проявятся только после появления настоящей сетки). Хотя работа над полномочиями сущностей была завершена в 2020 году, в настоящее время полномочия сущностей передаются только между клиентом и одним сервером, поэтому некоторый код может потребовать дополнительной корректировки.
 
Как вы планируете управлять большим кораблем, например, Javelin? Будет ли это отдельный выделенный ресурс с кораблями вокруг него?
 
При использовании технологии Dynamic Server Meshing возможно, что такие крупные корабли, как Javelin, будут иметь свой собственный выделенный сервер, на котором будет выполняться авторитетное моделирование этого корабля и всего, что на нем находится. Однако мы стараемся избегать негибких правил распределения объектов по вычислительным ресурсам, поэтому это не всегда возможно. Все сводится к эффективности с точки зрения скорости обработки и стоимости сервера. Если бы у нас было жесткое правило, что каждый Javelin и все, что в нем находится, получает свой собственный сервер, то это было бы не очень экономично, когда на Javelin находится всего несколько игроков. Это же правило не будет эффективным с точки зрения скорости обработки данных на сервере, если в одном Javelin будут находиться сотни игроков, поскольку оно не позволит распределить нагрузку на несколько серверов.
 
Динамическое объединение серверов будет несколько отличаться тем, что оно будет постоянно пересматривать, как лучше распределить симуляцию, стремясь найти оптимальное место, чтобы ни один сервер не был перегружен или недогружен. По мере перемещения игроков по локации идеальное распределение вычислительных ресурсов будет меняться. Чтобы реагировать на эти изменения, нам потребуется возможность передавать полномочия над сущностями с одного сервера на другой, а также вводить в строй новые и выключать старые серверы. Это позволит перенести нагрузку с сервера, который рискует оказаться перегруженным, на сервер, который в данный момент используется недостаточно. Если ни один из имеющихся серверов не обладает достаточной свободной мощностью, чтобы справиться с возросшей нагрузкой, мы можем просто арендовать дополнительные серверы у поставщика облачной платформы. А когда нагрузка на некоторые серверы станет недостаточной, чтобы сделать их экономически эффективными, одни из них смогут передать свою часть симуляции другим, а мы сможем отключить те, которые нам больше не нужны.
 
Сколько игроков смогут видеть друг друга в одном пространстве? Какой максимум вы планируете?
 
На этот вопрос трудно ответить, и лучший ответ, который мы можем дать на данный момент, - это то, что все зависит от ситуации.
 
Если исходить из того, что речь идет о предельном количестве игроков, которые смогут видеть друг друга с точки зрения клиента, то в основном это диктуется клиентом игры. Это связано с симуляцией на стороне клиента, такой как физика и игровой код, а также со стоимостью рендеринга.
 
Кроме того, это сильно зависит от сценария: 100 игроков в FPS-боевике дешевле смоделировать и отрендерить на клиенте, чем 100 игроков, сражающихся на одноместных космических кораблях, стреляющих друг в друга ракетами и лазерами.
 
Графическая команда активно работает над Vulkan, что позволит нам увеличить количество вызовов отрисовки и улучшить одновременный рендеринг большого количества игроков/кораблей, в то время как команда движка сосредоточена на оптимизации игрового кода для увеличения количества игровых объектов, которые мы можем моделировать одновременно.
 
Мы стремимся увеличить количество игроков и ожидаем, что будем поддерживать сценарии, в которых 100 игроков смогут видеть друг друга при разумной частоте кадров. Однако по мере того как мы будем масштабировать наши шарды для поддержки большего количества игроков, вероятность того, что каждый игрок в пределах шарда сможет попасть в одно и то же физическое место и увидеть друг друга без проблем с производительностью, будет снижаться. 
 
Именно в этом случае нам потребуется внедрить игровые механики, которые не позволят подобным сценариям возникать слишком часто.
 
Абсолютный предел трудно предсказать до тех пор, пока не появятся новые технологии и мы не начнем измерять производительность.

 

Если я создам базу на луне, будет ли моя база отражаться на других осколках, на которых меня нет?
 
Команда Planet Tech планирует реализовать строительство баз на серверных осколках. Если вы претендуете на землю для своей базы, то эта земля будет заявлена на всех шардах, и мы планируем реплицировать вашу базу на все шарды.
 
Однако только один шард будет иметь "активную" версию базы, а на других шардах будет создаваться "ограниченная/только для чтения" версия той же базы. Например, база будет давать полный доступ и возможность расширяться на том осколке, на котором ее владелец играет в данный момент, а на всех остальных осколках эта база может появляться с запертыми дверями в неизменном состоянии. Полный дизайн пока не определен на 100% и может измениться.
 
Является ли истинной конечной целью единый шард для всех игроков?
 
Мы стремимся к этому, однако дать однозначный ответ на данный момент не представляется возможным.
 
Мы начнем с множества небольших шардов на регион и будем постепенно сокращать их количество. Первой крупной целью будет сокращение числа осколков до одного на регион. Чтобы достичь этой цели, мы планируем постепенно увеличивать количество игроков на каждом осколке и постоянно совершенствовать бэкэнд и клиентские технологии, чтобы поддерживать все большее количество игроков.
 
Для достижения этой цели необходимы не только технологические изменения, но и новый игровой дизайн и игровые механики. Без механики, предотвращающей попадание каждого игрока в одно и то же место, создать большой мегаосколок будет очень сложно, особенно на клиенте. Например, можно предусмотреть механику временного закрытия точек перехода в переполненные локации или создать новые уровни для определенных локаций.
 
В то время как бэкэнд рассчитан на горизонтальное масштабирование, клиент игры работает на одной машине и ограничен определенным количеством ядер CPU/GPU, а также памяти.
 
Только преодолев эти препятствия и создав по одному мега-шарду на регион, мы сможем сразиться с последним боссом: Объединение региональных шардов в один глобальный мега-шард.
 
Это сопряжено с рядом проблем, поскольку локальность играет большую роль для игроков. Например, задержки между сервисами в одном центре обработки данных гораздо ниже, чем задержки между сервисами, размещенными в двух разнесенных по регионам центрах обработки данных. И хотя мы спроектировали бэкэнд для поддержки одного глобального шарда, развернуть его таким образом, чтобы не создавать преимуществ для одной группы игроков перед другой, является сложной операционной задачей.
 
Будет ли экономика вселенной независимой на каждом осколке или объединенной?
 
Экономика будет глобальной и отражаться на каждом осколке. 
 
Например, рассмотрим магазины. В то время как каждый магазин имеет локальный инвентарь (предметы, которые выставлены в данный момент), магазины пополняются из глобального инвентаря, общего для всех осколков. Если многие игроки начнут покупать определенное оружие в оружейном магазине Порт-Олисара, цена на него будет расти на всех шардах. В конце концов, запасы этого оружия будут исчерпаны, и магазины на всех шардах больше не смогут пополнять запасы этого оружия.
 
 
Что помешает большим группам "синих" и большим группам "красных" оказаться на осколках с эхо-камерой? Социальная динамика предполагает большую концентрацию людей, которые будут иметь друзей и состоять в организациях с одинаковыми интересами. Будет ли найдено решение, которое обеспечит правильное смешение хороших, плохих и промежуточных вариантов?
 
Игроки не будут постоянно прикреплены к шардам, так как система подбора игроков при каждом входе в игру назначает новый шард для выбранного региона. На ранних этапах это приведет к естественному распределению, поскольку мы начнем с множества небольших шардов параллельно.
 
По мере масштабирования шардов (и, соответственно, уменьшения количества параллельных шардов) этот вопрос будет становиться все более актуальным. Мы планируем решить его с помощью новой системы подбора игроков.
 
Новая система подбора игроков, разрабатываемая в настоящее время вместе с системой Server Meshing, позволяет подбирать игроков к шардам на основе множества входных параметров. Эти параметры используются для того, чтобы сопоставить игроков с их друзьями или с тем местом, где они оставили большинство своих предметов в открытом мире. Однако оно также позволяет нам использовать более сложные параметры, такие как репутация и другие скрытые статистические данные игроков, которые мы отслеживаем.
 
Это позволит нам стремиться к тому, чтобы на каждом осколке присутствовал полуразнообразный состав игроков. Например, мы можем убедиться, что на осколке не будет только законопослушных игроков, что может быть не очень интересно, если игроки хотят охотиться на преступников.
 
Будет ли ваш персонаж и корабль всегда оставаться в игре после того, как вы покинете ее; т.е. если я выйду из своего корабля, лежащего на планете, будет ли мой корабль все еще там, т.е. люди могут попытаться проникнуть на мой корабль или уничтожить его?
 
Когда сущность "распаковывается" на осколке (она физически существует на осколке), она постоянно существует в пределах этого осколка до тех пор, пока игрок не "уберет" сущность в инвентарь. Это можно сделать, подобрав оружие и положив его в рюкзак, или посадив корабль на посадочную площадку, в результате чего корабль будет помещен в определенный инвентарь посадочной площадки. Как только предмет попадает в инвентарь, он сохраняется в глобальной базе данных и может быть извлечен из нее на любом осколке. Это позволит игрокам перемещать предметы между осколками.
 
Мы также планируем создать механику под названием "Укладка/разгрузка предметов героя". Она будет забирать все принадлежащие игроку предметы героев и автоматически складывать их в инвентарь при переходе с одного осколка на другой. Автоматическая укладка обычно происходит, когда рядом нет других игроков и сущность выведена из игры. Предметы в этом инвентаре для перехода на другой шард будут автоматически следовать за игроком, поэтому, когда игрок войдет на другой шард, мы заберем предметы и выгрузим их обратно на новый шард в том месте, где их оставил игрок.
 
Когда вы сажаете свой корабль на луну и выходите из системы, корабль будет выходить из системы и автоматически укладываться, если в этот момент рядом нет других игроков. Теперь, когда вы войдете на другой шард, ваш корабль будет выгружен на новый шард. Если по какой-то причине корабль оставался на старом осколке дольше и был уничтожен, пока вы выходили из системы, вы можете проснуться на медицинской койке.

 

Насколько новый контент теперь зависит от Server Meshing?
 
Объединение серверов позволит нам увеличить количество игроков, которые могут играть вместе в Star Citizen, но также позволит нам начать добавлять новый контент. В данный момент мы сосредоточены на добавлении новых звездных систем. Server Meshing - это одна из ключевых технологий, позволяющих реализовать в игре работу точек перехода, благодаря которой звездные системы могут плавно перемещаться в память и из нее без необходимости использования экранов загрузки. Впервые игроки увидят это в следующем году, когда первая итерация Server Meshing начнет работать с внедрением системы Pyro.
 
По мере совершенствования технологии и перехода от статического моделирования серверов к динамическому, дизайнеры смогут использовать эту технологию для создания более крупных и интересных областей (например, больших поселений или интерьеров крупных кораблей) с более плотным расположением персонажей ИИ и игроков. Server Meshing может открыть двери для игрового процесса, о котором наши дизайнеры еще даже не задумывались!
 
На какой прирост производительности мы можем рассчитывать?
 
Наибольший прирост даст производительность сервера. В настоящее время производительность наших серверов весьма ограничена из-за огромного количества объектов, которые мы должны моделировать на одном сервере. Это приводит к очень низкой частоте кадров и деградации сервера, в результате чего клиент испытывает сетевые задержки, резиновые полосы и другие проблемы с рассинхронизацией сети. Как только мы получим даже статическую сетку, мы ожидаем, что частота кадров на сервере будет значительно выше, что приведет к уменьшению подобных симптомов.
 
На клиентский FPS серверная сетка оказывает очень незначительное влияние. Клиент и так передает только те объекты, которые находятся в зоне видимости. Возможно, будут некоторые незначительные улучшения, поскольку мы можем быть более агрессивными с очисткой радиуса действия на клиенте, так как сейчас некоторые объекты имеют большой радиус потоковой передачи для корректной работы таких функций, как радар или ракеты. С помощью Server Meshing мы сможем разделить радиус потоковой передачи на клиенте и сервере. Однако на клиенте эти улучшения будут минимальными. Тем не менее, более высокий FPS на сервере улучшит общее впечатление от игры, так как значительно уменьшится сетевая задержка.
 
Я знаю, что ответа на этот вопрос, возможно, еще нет, но при первоначальном выпуске Server Meshing, какое количество шардов, по вашим прогнозам, потребуется? 10, 100, 1000, больше? Мы знаем, что переход от DGS означает увеличение количества игроков на одну игровую зону, просто не уверены, сколько игроков вы ожидаете.
Короткий ответ заключается в том, что мы не можем назвать конкретную цифру.
 
Концепция шарда - это "податливая" часть архитектуры сетки, и мы сможем сказать, сколько шардов потребуется, только когда все компоненты будут на месте, и мы планируем итеративно к этому прийти.
 
При первом запуске Persistent Streaming (не meshing) мы хотим начать с имитации текущего поведения, которое вы видите в Интернете: один шард на серверный экземпляр и один репликант (так называемый гибрид). Единственное отличие заключается в том, что все сущности в этих шардах будут постоянными. Это позволит нам справиться с наихудшим сценарием, имея очень большое количество постоянных осколков и очень больших репликантов для тестирования механики создания/посева, симуляции с активными игроками, а также спуска для переработки или уничтожения. Мы хотим, чтобы создание и уничтожение осколков на этом первом этапе было оптимальным, быстрым и не требовало больших затрат.
 
Такой подход имеет ряд преимуществ, поскольку мы можем раньше протестировать устойчивость осколков и, что более важно, можем измерить активные показатели на многих осколках.
 
Например (неполный список!):
  • Сколько сущностей остается в персистентном шарде с течением времени (скорость роста шарда)
  • Размер глобального графа (темп роста глобального графа)
  • Сколько игроков может обслуживать база данных одного осколка (использование игроков)
  • Влияние нескольких игровых механик на обновление сущностей в базе данных осколков (эффекты игрового процесса)
  • Профиль производительности очередей записи, среднее время запросов к кластерам базы данных шардов (метрики базы данных шардов)
  • Профиль производительности очередей записи, среднее время выполнения запросов в глобальном кластере баз данных (метрики глобальной базы данных)
  • Эффективность шардирования баз данных (еще один уровень шардирования!) графа
 
Хотя у нас есть соответствующие оценки и внутренние измерения для них, ничто не заменит реальных игроков, создающих репрезентативную нагрузку на систему.
 
 
По мере внедрения других компонентов сетки, в первую очередь статической, мы планируем постепенно уменьшать количество шардов, объединяя игроков во все большие и большие шарды, пока мы не почувствуем себя комфортно с производительностью репликантов, DGS и графа сущностей. Конечно, статическая сетка будет страдать от проблем скопления игроков, и мы сможем вернуться к использованию более крупных шардов только после того, как будет создана динамическая сетка.
 
В конечном счете, с помощью динамической сетки мы стремимся поддерживать очень большие шарды. 
 
Может ли такой маленький актив, как пуля, перемещаться между осколками сервера?
 
Короткий ответ - нет.
 
Осколки можно рассматривать как полностью изолированные экземпляры моделируемой вселенной, подобно тому, как в настоящее время мы имеем различные изолированные экземпляры на выделенном сервере. Для того чтобы предметы могли передаваться между инстансами, они должны быть помещены в инвентарь, прежде чем их можно будет выгрузить на другой шард. Например, если игрок берет оружие на одном шарде, а затем кладет его в рюкзак. Теперь, когда игрок подключается к другому осколку, он может достать пистолет из рюкзака, выгрузив его на новый осколок.
 
В пределах одного осколка такая сущность, как ракета, может перемещаться по нескольким серверным узлам, если эти серверные узлы имеют ракету в пределах потоковой области сервера. Только один серверный узел будет контролировать (иметь полномочия) эту ракету, в то время как другие серверные узлы будут видеть только клиентское представление этой ракеты.
 
Пули фактически порождаются на стороне клиента. Таким образом, на каждом клиентском и серверном узле создается своя версия пули, поэтому в приведенном выше примере я использовал сетевую репликацию сущности, такой как ракета. 
 
Когда вы будете работать с разными регионами мира, вы планируете разместить четыре основные серверные фермы, такие как США, ЕС, Китай, Океания? Или вы планируете сделать "единую глобальную вселенную"? Если глобальной, то как это повлияет на баланс игроков с экстремальными колебаниями пинга?
 
Мы по-прежнему планируем сохранить региональное распределение чувствительных к сети сервисов. На начальном этапе развертывания Persistent Streaming глобальная база данных будет действительно глобальной. Сами шарды будут распределены по регионам, поэтому игровой клиент, подключающийся к региону ЕС, будет предпочтительно сопоставлен с шардом ЕС. По мере роста размера шардов (как для игроков, так и для сущностей) мы планируем вернуться к этой модели, а также ввести сервисы регионального уровня для обслуживания данных ближе к населенному пункту.

Я живу в Восточной Европе. Смогу ли я после запуска Server Meshing играть с друзьями из США?
 
Мы не планируем ограничивать выбор осколков и регионов. 
 
Игрок сможет выбрать любой регион для игры, а в пределах этого региона мы разрешим ограниченный выбор шардов. Например, шард с друзьями или шард, на котором вы играли в последний раз. 
 
Поскольку все данные игрока хранятся в глобальной базе данных, игроки смогут переключаться между осколками аналогично тому, как они переключаются между инстансами сегодня. Хранящиеся предметы переносятся вместе с игроком и всегда доступны независимо от шарда.
 
Гибель слоя репликации: Что будут испытывать игроки, если уровень репликации отключится или "умрет"? Мы знаем, что граф сущностей будет собирать посеянную информацию и передавать ее в новый слой репликации, но вернемся ли мы в главное меню, если слой репликации умрет, по сравнению с тем, если умрет узел сервера, или у нас будет что-то вроде экрана загрузки, который автоматически подгонит нас к новому слою?
 
Для того чтобы ответить на этот вопрос, мне сначала нужно более подробно рассказать о том, как будет выглядеть наша окончательная архитектура. В конечном счете, слой репликации не будет представлять собой один серверный узел. Вместо этого он будет состоять из нескольких экземпляров набора микросервисов с такими названиями, как Replicant, Atlas и Scribe. Одним из преимуществ такого подхода является возможность масштабирования самого уровня репликации. Другое преимущество, более относящееся к данному вопросу, заключается в том, что, хотя отдельный узел/экземпляр уровня репликации может выйти из строя, очень маловероятно, что весь уровень репликации выйдет из строя сразу. С точки зрения клиента узлы-репликанты наиболее важны, поскольку именно они будут выполнять сетевое парение сущностей и репликацию состояния между клиентами и игрой. Репликант спроектирован таким образом, чтобы не выполнять никакой игровой логики, и, по сути, он будет выполнять очень мало кода вообще: ни анимации, ни физики, только сетевой код. Создание на основе такой небольшой кодовой базы должно означать меньшее количество ошибок. Поэтому, после некоторых неизбежных проблем, мы ожидаем, что Replicants будет достаточно стабильной. Важно также знать, что в каждый момент времени один клиент может обслуживаться несколькими репликантами (но эти репликанты будут одновременно обслуживать и других клиентов). Последняя часть головоломки - уровень шлюза: Клиенты будут подключаться не непосредственно к репликантам, а к шлюзовому узлу на уровне шлюза. Служба Gateway служит для передачи пакетов между клиентами и различными репликантами, с которыми они общаются. Служба шлюза использует еще меньшую кодовую базу, чем репликатор, поэтому вероятность сбоя должна быть еще меньше.
 
Что же будет испытывать клиент, если один из обслуживающих его репликантов внезапно выйдет из строя?
 
Клиент останется подключенным к шарду, но часть или вся его симуляция временно зависнет. Уровень репликации запустит новый узел-репликант взамен отказавшего и восстановит потерянное состояние сущности из сохранения через EntityGraph. Клиентские шлюзы и узлы DGS, которые были подключены к старому репликанту, восстановят связь с новым. После восстановления связи игра будет разморожена для затронутых клиентов. В этот момент клиент может испытывать некоторые замирания/телепортацию сущностей. Мы надеемся, что весь процесс займет меньше минуты.
 
Что будет испытывать клиент, если обслуживающий его шлюз внезапно выйдет из строя?
 
Служба шлюза не хранит никакого игрового состояния и будет иметь свою собственную форму восстановления после сбоя. Поскольку это гораздо более простая служба, чем репликант, время восстановления должно быть гораздо быстрее, скорее, в районе нескольких секунд. Во время восстановления клиент будет испытывать временное зависание с последующим переключением на телепорт.
 
А как насчет сервиса Hybrid?
 
Во время своего выступления на CitizenCon, посвященного постоянным потокам и объединению серверов, Пол и Бенуа рассказали об уровне репликации в терминах сервиса Hybrid. Гибридный сервис, как следует из его названия, представляет собой гибрид сервисов Replicant, Atlas, Scribe и Gateway, о которых я говорил выше (но не EntityGraph), а также ряда других сервисов, которые пока не обсуждались. Мы решили сначала разработать эту систему, а затем разделить ее на составляющие сервисы, поскольку это уменьшает количество движущихся частей, с которыми мы пытаемся справиться одновременно. Это также позволяет нам сконцентрироваться на отработке всех основных концепций, а не на том, чтобы обеспечить корректное взаимодействие всех этих отдельных сервисов. В этой первоначальной реализации уровень репликации будет представлять собой один узел гибридного сервера. Если этот гибридный узел падает, то ситуация будет похожа на ту, которую клиенты испытывают сейчас при падении выделенного игрового сервера. Все клиенты будут возвращены во внешнее меню с печально известной ошибкой 30k. Как только будет запущен замещающий гибрид, клиенты смогут вернуться на шард и продолжить работу с прежнего места. Надеюсь, нам удастся реализовать это таким образом, чтобы клиенты получали уведомление на экране о том, что шард снова доступен, и одно нажатие клавиши возвращало их на шард (аналогично тому, как это работает при восстановлении клиента после сбоя).
 
 
В ходе дискуссии мы много говорили о том, какие узлы имеют право записи внутри шарда, но как быть с правом записи между отдельными шардами? Ведутся ли отдельные базы данных постоянства для разных шардов или состояния элементов мира в конечном итоге будут синхронизированы между шардами, даже если они были оставлены в разных состояниях (например, дверь оставлена открытой на одном шарде и закрытой на другом - будет ли один шард в конечном итоге записывать свое состояние в базу данных, обновляя состояние двери на другом шарде)?
 
Вообще говоря, каждый осколок - это своя уникальная копия вселенной, и любой элемент внутри осколка не будет иметь общего состояния с элементом другого осколка, поскольку каждый осколок имеет свою собственную базу данных. С другой стороны, у нас есть глобальная база данных для инвентарных данных игроков. Эта база данных используется для хранения всех предметов в инвентаре игрока, и предметы могут перемещаться между осколками, если они сначала были помещены с одного осколка в инвентарь, а затем выгружены на другой осколок.
 
Некоторые функции, такие как аванпосты игроков или добываемые ресурсы, реализуют специальный код, который копирует глобальное состояние на все осколки, поэтому аванпост может существовать на нескольких осколках параллельно и медленно (относительно скорости игры в реальном времени) копировать свое состояние между осколками. Это не мгновенная репликация (открытие/закрытие двери не будет реплицировано), однако постоянное состояние, например, запертая или незапертая дверь, может быть реплицировано между осколками.
 
Аналогично обстоит дело с добываемыми ресурсами: Хотя каждый осколок имеет свою уникальную версию добываемого камня, общее количество будет реплицироваться между осколками, поэтому, когда игроки начинают добывать определенную область, глобальная карта ресурсов для этой области будет изменена, и количество добываемых камней в этой области будет изменено на всех осколках.
 
Когда партия перемещается (квантовое перемещение или другое) от одного объекта к другому, а другой узел DGS, объект или экземпляр заполнен, будет ли T0 / Static Meshing создавать другой узел DGS с упреждением? Или как это будет решаться?
В Static Server Meshing все фиксируется заранее, включая количество серверных узлов на осколке и то, какой игровой сервер отвечает за моделирование тех или иных локаций. Это означает, что если все жители шарда решат отправиться в одно и то же место, то все они окажутся смоделированными одним и тем же серверным узлом.
 
На самом деле, худшим вариантом будет, если все игроки решат распределиться между всеми локациями, закрепленными за одним серверным узлом. В этом случае бедный сервер будет не только пытаться справиться со всеми игроками, но и должен будет вести потоковую трансляцию во всех своих локациях. Очевидный ответ - разрешить больше серверов на осколке, чтобы у каждого серверного узла было меньше локаций, в которые ему нужно вести трансляцию. Однако, поскольку это статическая сетка и все фиксируется заранее, наличие большего числа серверных узлов на осколке также увеличивает эксплуатационные расходы. Но нужно с чего-то начинать, поэтому план первой версии Static Server Meshing - начать с такого количества серверных узлов на шард, которое будет возможно, и при этом проверить, что технология действительно работает. Очевидно, что это станет проблемой, если мы позволим шардам иметь гораздо больше игроков, чем 50, которые мы имеем сейчас в наших односерверных "шардах".
 
Поэтому не стоит ожидать большого увеличения количества игроков в первой версии. Это позволит избежать проблемы переполнения узла одного сервера до того, как туда придут игроки, поскольку мы будем ограничивать максимальное количество игроков на одном шарде, исходя из наихудшего случая. После того, как это заработает, мы посмотрим на производительность и экономику и увидим, как далеко мы можем зайти. Но для того, чтобы дальнейшее расширение было экономически целесообразным
 
 

Статья на сайте разработчика - https://robertsspaceindustries.com/comm-link/transmission/18397-Server-Meshing-And-Persistent-Streaming-Q-A

 


Подпишитесь на наш Telegram / starcitizenhelp_ru что бы всегда быть в курсе актуальных обновлений и новостей.
Для того, что бы оставить комментарий, войдите или зарегистрируйтесь.