> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/ru/learn/orkestraciya/postoyanstvo.md).

# Постоянство

Запускайте постоянные игровые миры на Edgegap с работающими круглосуточно, без выходных, развертываниями, поддерживаемыми частными флотами.

Управляйте постоянными мирами с круглосуточными постоянными онлайн-развёртываниями на [Частные флоты](/ru/learn/orkestraciya/chastnye-floty.md).

Многие жанры (MMO, песочницы, социальные игры) используют постоянные миры, чтобы позволить игрокам:

* знакомиться и общаться с новыми друзьями; развивать органичные сообщества игроков,
* исследовать живой открытый мир, наполненный пользовательским контентом, размещённым игроками,
* участвовать в эпических рейдовых битвах, длящихся часами, с большими группами или целыми гильдиями.

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

{% hint style="success" %}
&#x20;В качестве альтернативы, см. [Развертывания](/ru/learn/orkestraciya/deployments.md#match-bound) облачная оркестрация для использования дробного ценообразования vCPU.
{% endhint %}

## ✔️ Подготовка

Чтобы обеспечить постоянные, непрерывные круглосуточные онлайн-развёртывания:

1. [Создайте новую версию приложения (или обновите существующую).](https://app.edgegap.com/application-management/applications/list)
   * В Dashboard — выберите «persistent» вместо указания максимальной продолжительности.
   * В API — укажите `"max_duration": -1`  в запросе версии приложения.
2. [Создайте частный флот в панели управления и запланируйте хосты.](https://app.edgegap.com/private-fleet-management/private-fleets/list)
   1. Создание флота бесплатно, сделайте это сначала, чтобы просмотреть локации и детали.
   2. Выберите спецификации Virtual Machines (Performance) или Bare Metal (Overdrive).
   3. Перед планированием хостов вам будет предложено подтвердить итоговую цену.
3. Разворачивайте новые серверы с [Браузер серверов](/ru/learn/brauzer-serverov.md) или пользовательскими интеграциями.
   1. Server Browser запускает серверы в соответствии с настроенными [политиками масштабирования](/ru/learn/brauzer-serverov.md#automated-scaling).
   2. Пользовательские интеграции должны [запускать серверы, используя API частного флота](https://docs.edgegap.com/ru/learn/orkestraciya/pages/29817f7f12eb7460eb5569ee2fce1cd1a966d23d#id-3.-deploy-servers).

{% hint style="warning" %}
**Проверьте масштабирование ваших серверов и** [**процесс завершения**](https://docs.edgegap.com/ru/learn/orkestraciya/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped) **чтобы убедиться в надёжности контроля затрат. Состояние сервера, хранящееся в памяти, будет потеряно после остановки развертывания, см.** [#configuration-and-state](#configuration-and-state "mention").
{% endhint %}

{% hint style="info" %}
Если вам нужна помощь, [свяжитесь с нами через Discord](https://discord.gg/MmJf8fWjnt). Для поддержки по играм в реальном времени см. нашу [систему тикетов](https://edgegap.atlassian.net/servicedesk/customer/portal/3).
{% endhint %}

## 🔑 Владение сервером

Плюсы и минусы современных и традиционных моделей владения с edge computing.

### Хостинг студии

Серверы традиционно управляются студией, а затраты на хостинг окупаются за счёт доходов от игры.

👍 **Преимущества**

* Без дополнительных платежей для игроков — стоимость хостинга окупается из доходов студии.
* Высокая совместимость клиент/сервер с слабой связанностью клиента/сервера/сервиса.
* Более устойчиво к читерству и злоупотреблениям благодаря закрытому исходному коду игры.

👎 **Недостатки**

* Ограниченная поддержка моддинга сообщества для обеспечения целостности и честности сервера.

### Серверы сообщества

Позвольте игрокам финансировать собственные серверы на Edgegap и откройте источник дохода от хостинга, который иначе ушёл бы сторонним хостинг-сервисам, не понимающим опыт пользователей.

👍 **Преимущества**

* Улучшите поддержку моддинга с помощью отобранных модов и версий.
* Улучшайте игру итеративно через прямое сотрудничество с сообществом.
* Укрепляйте доверие сообщества за счёт повышенной долговечности игры и модели самообслуживания.

👎 **Недостатки**

* Требуются инвестиции в разработку для поддержки моддинга и совместимости.
* Больше операционных усилий для управления сообществом и платёжными системами.
* Повышенный риск обратной разработки из-за раскрытия внутренностей игры.

## 🥛 Вместимость и масштабирование

Изучите продвинутые техники для оптимизации стоимости сервера и качества обслуживания.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2F91f3tTfRA1zGqicfH8Ru%2Fimage.png?alt=media&amp;token=a483a218-80cf-477a-9218-74e33777d68a" alt=""><figcaption><p>Референсная архитектура автоскейлинга</p></figcaption></figure>

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

{% hint style="warning" %}
**Ручного запуска развертываний и вставки URL и портов недостаточно для живой игры.**
{% endhint %}

Автоматизируйте популярные игровые сценарии для [Сеансы игроков](/ru/learn/orkestraciya/seansy-igrokov.md) и масштабирования серверов с помощью одного из следующих вариантов:

{% columns %}
{% column width="33.33333333333333%" %}
[Матчмейкинг](/ru/learn/matchmeiking.md):

* Соревновательные игры
* Матчи по запросу
* Рейтинг навыка и/или\
  Пользовательские правила
  {% endcolumn %}

{% column width="33.33333333333333%" %}
[Браузер серверов](/ru/learn/brauzer-serverov.md):

* Постоянные или социальные
* Длительные сессии
* Автораспределение и/или\
  Пользовательский поиск
  {% endcolumn %}

{% column width="33.33333333333333%" %}
Пользовательский бэкенд:

* Переносите игры в продакшене
* [Развертывайте с API v2](/ru/docs/api/vydelennye-servery.md)
* [Отслеживайте вебхуки](/ru/learn/orkestraciya/deployments.md#webhooks)
  {% endcolumn %}
  {% endcolumns %}

### Вместимость

**Развёртывания не отслеживают и не управляют активными подключениями игроков** после того как вы [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-start-a-deployment](https://docs.edgegap.com/ru/learn/orkestraciya/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-start-a-deployment "mention") чтобы дать вам полный контроль и свободу реализовать любой дизайн.

Внедрите управление ёмкостью, чтобы ваши серверы:

* **контролировали стоимость хостинга** - [проводить бенчмаркинг](/ru/learn/orkestraciya/deployments.md#container-metrics) и оптимизировали использование ресурсов сервера на игрока,
* **обеспечивали стабильный опыт** — поддерживайте CCU на сервер в безопасном диапазоне.

{% hint style="success" %}
См. [Браузер серверов](/ru/learn/brauzer-serverov.md) для автоматизированного управления ёмкостью с нашим управляемым сервисом.
{% endhint %}

<details>

<summary>Совет: если вы решите разработать собственный оркестратор сессий и ёмкости.</summary>

* Процедура должна предотвращать конкуренцию за ёмкость с одновременными резервированиями.
* Отправляйте частые heartbeat-сообщения вашему оркестратору, чтобы синхронизировать состояние сервера.
* Быстро удаляйте устаревшие, упавшие или остановленные серверы из процесса обнаружения.
* Снимайте резервирование ёмкости по таймауту, если игроки не подключаются в отведённое время.
* Отключайте клиентов и освобождайте ёмкость при обнаружении неактивности игрока.

</details>

{% hint style="warning" %}
**Количество зарезервированных ресурсов развертывания нельзя изменить во время выполнения.** Масштабируйте горизонтально с новыми экземплярами сервера, используя изменённые [версии приложения](/ru/learn/orkestraciya/application-and-versions.md) требующие больше ресурсов CPU или памяти.
{% endhint %}

### Масштабирование вверх

Умные стратегии масштабирования **предотвращают очереди для игроков и минимизируют стоимость простаивающих серверов**.

**Мы рекомендуем масштабировать ресурсы исходя из числа одновременных игроков, а не загрузки машины** (CPU и RAM), поскольку колебания нагрузки могут привести к непредсказуемой доступности.

{% hint style="info" %}
**Масштабирование не требует «примерной оценки» регионального трафика или стоимости сервера**. Запланируйте [Частные флоты](/ru/learn/orkestraciya/chastnye-floty.md) ёмкость для отлива[^1] и автоматически переносите нагрузку в облако во время неожиданных пиков трафика.
{% endhint %}

{% hint style="success" %}
Включить [Активное кэширование в вашей версии приложения](/ru/learn/orkestraciya/application-and-versions.md#active-caching) для развертывания серверов за считанные секунды.
{% endhint %}

### Масштабирование вниз

Отключение серверов без осторожности может негативно повлиять на игровой опыт. **Учитывайте эти факторы и тестируйте изменения перед выпуском:**

**Надёжно ли вы определяете неактивность / отключение игрока?**

* Надёжно ли отсутствие ввода от игрока? Игроки часто используют ботов и макросы, чтобы имитировать активность и избежать кика, что приводит к ожиданию в очереди при повторном подключении.
* Есть ли какие-либо другие индикаторы активности, которые сложнее подделать?
* Есть ли обходное решение в дизайне игры, чтобы смягчить влияние/мотивацию использовать ботов?

**Можете ли вы легко и быстро перезапускать серверы без серьёзных откатов?**

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

**Привязаны ли игроки к конкретным экземплярам серверов или могут легко мигрировать?**

* Как подключение к другому серверу влияет на аккаунт игрока, историю покупок, социальный опыт, прогрессию, инвентарь и общую удерживаемость игроков?
* Проверьте ваш [#recovery-objectives](#recovery-objectives "mention") и убедитесь, что критически важные данные не потеряны.
* Прозрачность и управление сообществом творят чудеса, если случается простой.

## 💭 Конфигурация и состояние

Определите параметры seed сервера и надёжно управляйте состоянием игрока/сервера.

### Управление конфигурацией

Конфигурация или seed относится к **начальным данным, передаваемым серверу при развёртывании:**

* [внедрённым переменным, зависящим от среды](/ru/learn/orkestraciya/application-and-versions.md#other-parameters-optional):
  * например, данным о совместимости версий клиента/сервера,
* [расположению сервера](/ru/learn/orkestraciya/deployments.md#arbitrium_deployment_location-detailed-information-about-deployment-location), [портам сервера](/ru/learn/orkestraciya/deployments.md#arbitrium_ports_mapping-detailed-information-about-your-internal-and-external-ports) и [другой информации о сервере](/ru/learn/orkestraciya/deployments.md#injected-environment-variables),
* [информации для подбора матчей](/ru/learn/matchmeiking/matchmaker-in-depth.md#injected-environment-variables) или [пользовательским переменным развёртывания](/ru/learn/orkestraciya/deployments.md#custom-variables),
* параметрам интеграций сторонних сервисов, ключам и секретам.

{% hint style="info" %}
**Конфигурация неизменяема.** Читается при запуске сервера, без изменений во время выполнения.
{% endhint %}

### Управление состоянием

Состояние относится к данным во время выполнения, **результату предыдущих действий игрока и событий сервера:**

* подключение игрока, изменения состояния, управляемые игроком (например, [Pawn](https://dev.epicgames.com/documentation/en-us/unreal-engine/pawn-in-unreal-engine)),
* изменения свойств, содержащиеся в уровне/сцене (например, [Actor](https://dev.epicgames.com/documentation/en-us/unreal-engine/actors-in-unreal-engine), [Game Object](https://docs.unity3d.com/6000.0/Documentation/Manual/GameObjects.html)),
* изменения, связанные с [режимом игры](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-mode-and-game-state-in-unreal-engine#gamemodes), [состоянием игры](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-mode-and-game-state-in-unreal-engine#gamestate), или [сценой игры](https://docs.unity3d.com/6000.0/Documentation/Manual/CreatingScenes.html) информацией.

{% hint style="info" %}
**Данные состояния часто меняются.** Синхронизация происходит много раз в секунду (tick rate).
{% endhint %}

{% hint style="success" %}
**Частые резервные копии состояния помогают предотвратить потерю данных** в случае неожиданных сбоев/проблем:

* асинхронные обновления через API стороннего игрового бэкенда, например [Nakama от Heroic Labs](/ru/learn/advanced-features/managed-clusters.md#nakama-by-heroic-labs),
* периодический heartbeat сервера, передающий сериализованные файлы состояния в [облачное объектное хранилище](https://www.linode.com/products/object-storage/).
  {% endhint %}

У stateful-компонентов обычно есть чётко определённый владелец — либо сервер, либо игрок.

#### Объекты, принадлежащие серверу

Объектами, принадлежащими серверу, может управлять только сервер. Подключённые игроки имеют ограниченный доступ только на чтение к объектам, принадлежащим серверу.

{% hint style="success" %}
Объекты, принадлежащие серверу, могут быть **восстановлены заменяющим сервером (миграция состояния)**. Они обычно не разделяются между одновременно работающими серверами (треб. server meshing).
{% endhint %}

#### Объекты, принадлежащие игроку

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

{% hint style="success" %}
**Создавайте резервные копии объектов, принадлежащих игроку, на устройстве игрока или в игровом бэкенде** между сессиями. Шифруйте состояние игрока и/или загружайте контрольные суммы состояния, чтобы обнаруживать несанкционированные изменения.
{% endhint %}

### Цели восстановления

Некоторые категории данных могут быть более чувствительны к потере данных и времени восстановления.

Мы настоятельно рекомендуем обсудить следующее внутри вашей команды:

* Категории данных, обрабатываемых вашими игровыми клиентами, серверами и игровым бэкендом.
* Влияние потери данных в каждой категории на ваших игроков и на ваш бизнес.
* Recovery Point Objective — допустимый объём потери данных до серьёзного ущерба.
* Recovery Time Objective — как быстро системе нужно восстановиться.

Ниже рассмотрите наш упрощённый пример оценки целей восстановления:

<table><thead><tr><th width="420">Категория данных</th><th>RPO</th><th>RTO</th></tr></thead><tbody><tr><td>аккаунт, подписка и покупки</td><td>🔥 5 мин</td><td>🔥 30 мин</td></tr><tr><td>прогресс, инвентарь и рейтинг навыка</td><td>🔥 5 мин</td><td>🔥 60 мин</td></tr><tr><td>модерация, производительность и отслеживание ошибок</td><td>⚠️ 30 мин</td><td>⚠️ 8 ч</td></tr><tr><td>социальные функции, история чата, поведенческая аналитика</td><td>⏬ 24 ч</td><td>⏬ 72 ч</td></tr></tbody></table>

{% hint style="success" %}
Заранее подготовьте план аварийного восстановления для ваших самых критичных категорий.
{% endhint %}

{% hint style="danger" %}
**Обработка сбоя сервера зависит от вашей** [**политики перезапуска процесса**](/ru/learn/orkestraciya/application-and-versions.md#safety-guardrails)**.** [Состояние сервера может быть потеряно](/ru/learn/orkestraciya/postoyanstvo.md#state-management).
{% endhint %}

## 👀 Наблюдаемость

Долгоживущие постоянные серверы создают новые задачи в области наблюдаемости, в частности обнаружение аномалий в мониторинге, логировании и отслеживании багов. Мы **настоятельно рекомендуем внедрить оповещения о перезапусках сервера** чтобы повысить трассируемость и дополнительный контроль за временем безотказной работы.

{% hint style="warning" %}
Подключите свой [Хранилище конечной точки](/ru/docs/endpoint-storage.md) чтобы сохранять журналы развертывания, иначе они будут удалены!
{% endhint %}

{% hint style="info" %}
Добавьте пользовательские логи и отслеживание ошибок ([Sentry](https://sentry.io/welcome/), [Bugsnag](https://www.bugsnag.com/)) для устранения частичных сбоев.
{% endhint %}

[^1]: минимального CCU в течение дня
