# Подробный обзор

Узнайте подробнее о концепциях no-code matchmaker от Edgegap и настройте их под свои нужды.

## ✔️ Введение

**Начните за 5 минут и бесплатно протестируйте все функции, кредитная карта не требуется.**

Переходите на более мощный, приватный (выделенный) кластер, когда будете готовы. Нативная интеграция с Edgegap [deployments](https://docs.edgegap.com/ru/learn/orkestraciya/deployments "mention") обеспечивает лучший в классе пинг независимо от того, где находятся ваши игроки.

{% hint style="info" %}
Бесплатный тариф позволяет 3 часа работы после каждого перезапуска. Ваш matchmaker будет работать на общей инфраструктуре с ограниченными ресурсами, подходящей для тестирования. **После публичного релиза ваш matchmaker должен работать 24/7.**
{% endhint %}

У каждого Matchmaker есть три основных концепции:

* [#hosting-cluster](#hosting-cluster "mention") - базовая серверная инфраструктура, полностью управляемая и обслуживаемая Edgegap.
* [#configuration](#configuration "mention") - набор правил и настроек, определяющих, как работает matchmaker.
* 🌐 Экземпляр сервиса **-** живой сервис подбора игроков, работающий 24/7 на Cluster, использующий Configuration для подбора игроков и создания назначений развертывания (сервера).

{% hint style="success" %}
[Часто обновляйте версию вашего matchmaker](#changelog) чтобы **получать преимущества новых функций и исправлений ошибок.**
{% endhint %}

## ▶️ Начать подбор игроков

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

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fm4U4bgwucX6iGEieMISU%2Fimage.png?alt=media&#x26;token=39b97619-700b-4062-9dd9-73fa08fb96c2" alt=""><figcaption><p>Последовательность подбора игроков</p></figcaption></figure>

1. [Аутентифицировать игрока](#authenticate) - предотвращает игру в сети с пиратских копий,
2. [Создать лобби](#create-group) - объединиться с друзьями и поделиться предпочтениями игрока/матча,
3. [**Объединиться в группу**](#group-up) **- зарегистрировать ваше лобби как группу подбора игроков,**
4. [**Найти матч**](#find-match) **- подготовиться и начать поиск матча (нового или существующего),**
   1. Назначить сервер и внедрить тикеты - сервер назначается автоматически через несколько секунд,
5. [**Подключиться и аутентифицироваться**](#connect-to-server) **- попытаться установить защищённое соединение с игровым сервером,**
   1. Подтвердить личность - сервер проверяет личность игрового клиента с помощью токенов сторонних сервисов,
   2. Принять игрока или исключить игрока - сервер решает, разрешено ли игроку присоединиться.

**Быстро начните работу — добавьте в свою игру наш стартовый пример подбора игроков**:

### Аутентификация

{% hint style="success" %}
**Этот токен можно безопасно включить в игровой клиент, так как он не предоставляет доступ к API Edgegap.**
{% endhint %}

Отдельных игроков можно идентифицировать по ID их тикета, доступному на клиентах и сервере. При желании добавьте собственную аутентификацию или ограничения с помощью собственного прокси через [#server-to-server-api](#server-to-server-api "mention") API.

### Объединиться в группу

Создание группы (party) гарантирует, что игроки попадут в одну и ту же команду и на один и тот же сервер со своими друзьями.

{% hint style="success" %}
Создайте группу, помеченную как готовая, чтобы [#find-match](#find-match "mention") быстро как **одиночный игрок без участников группы**.
{% endhint %}

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FzPLV5ap16XQn0vYZsnQb%2FUntitled-2024-10-29-1018.png?alt=media&#x26;token=aa7165ab-abe1-4f7d-a84e-d2c4af8f36ad" alt=""><figcaption><p>Диаграмма активности жизненного цикла группы</p></figcaption></figure>

#### Лобби и группа

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

{% hint style="success" %}
**Нет времени на сервис Lobby?** Предложите игрокам обмениваться ID группы через Discord или личные сообщения.
{% endhint %}

<table><thead><tr><th width="390">Дизайн игры - Функция / Требование</th><th>Предматчевое лобби</th><th>Группа Matchmaker</th></tr></thead><tbody><tr><td><a data-footnote-ref href="#user-content-fn-1">приглашать друзей играть со мной</a></td><td>✅</td><td>✅</td></tr><tr><td>изменять мои предпочтения игрока/матча</td><td>✅</td><td>❌</td></tr><tr><td>просматривать предпочтения других участников лобби</td><td>✅</td><td>❌</td></tr><tr><td>хранить и управлять пользовательскими данными в формате ключ-значение</td><td>✅</td><td>❌</td></tr><tr><td>уведомлять участников группы, что я готов играть</td><td>❌</td><td>✅</td></tr><tr><td>показывать ход подбора игроков и находить матч</td><td>❌</td><td>✅</td></tr><tr><td>получать назначение команды для игрока/группы</td><td>❌</td><td>✅</td></tr><tr><td>получать данные подключения к игровому серверу</td><td>❌</td><td>✅</td></tr></tbody></table>

Наш кроссплатформенный matchmaker поддерживает все коммерческие и пользовательские сервисы Lobby:

<table><thead><tr><th>Сервис Lobby (сторонний)</th><th width="120" data-type="checkbox">Unreal Engine</th><th width="75" data-type="checkbox">Unity</th><th width="50" data-type="checkbox">ПК</th><th width="90" data-type="checkbox">Консоли</th><th width="65" data-type="checkbox">VR/XR</th><th width="100" data-type="checkbox">Мобильные устройства</th></tr></thead><tbody><tr><td><a href="https://dev.epicgames.com/docs/game-services/lobbies-and-sessions/lobbies/lobbies-intro">Лобби Epic Online Services</a><br>(Epic Games)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr><tr><td><a href="https://partner.steamgames.com/doc/features/multiplayer/matchmaking#friends">Лобби Steamworks</a><br>(Valve Corporation)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr><tr><td><a href="https://heroiclabs.com/docs/nakama/concepts/groups/">Группа Nakama</a><br>(Heroic Labs)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr><tr><td><a href="https://learn.microsoft.com/en-us/gaming/playfab/community/associations/groups/quickstart">Лобби Playfab</a><br>(Microsoft)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr><tr><td><a href="https://docs.braincloudservers.com/learn/key-concepts/multiplayer/lobbies/#lobby-experience">Лобби brainCloud</a><br>(bitHeads)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr><tr><td><a href="https://developer.apple.com/documentation/gamekit/connecting-players-with-their-friends-in-your-game">Друзья Gamekit</a><br>(Apple)</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr><tr><td>Пользовательское лобби<br>(ваша компания)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr></tbody></table>

Владелец лобби (игрок, отправляющий приглашения) также должен создать группу подбора игроков.

**Сохраните ID вашей группы в общих данных лобби**, чтобы другие участники лобби могли легко найти и присоединиться к группе подбора, связанной со сторонним лобби. Игроки, приглашённые в группу, используют ID группы, чтобы **создавать свои членства (присоединяться)**, а также чтобы **безопасно хранить свои** [**атрибуты подбора**](#matchmaking-rules)**.**

{% hint style="warning" %}
**После того как группа начинает подбор, к ней уже нельзя присоединиться.** [#abandon-queue](#abandon-queue "mention") и создайте новую.
{% endhint %}

#### Оптимизация пинга

Если [#configuration](#configuration "mention") включает [`задержки` правило](#rule-example-elo_rating) все участники группы отправляют свои [ping-beacons](https://docs.edgegap.com/ru/learn/orkestraciya/ping-beacons "mention") измерения в **предотвращать подбор игроков из удалённых регионов** или с гораздо более высоким/низким пингом (задержкой).

{% code title="Пример измерений пинга игрового клиента в миллисекундах" %}

```json
{
  "Chicago": 224.4,
  "Frankfurt": 23.2,
  "Tokyo": 167.4
}
```

{% endcode %}

#### **Покинуть очередь**

Владелец группы может удалить группу, автоматически удалив все членства в группе. Удаление группы после начала подбора отменит все членства и удалит их вскоре после этого.

Участники группы (кроме владельца) могут удалить свои членства (покинуть группу) в любое время до [#find-match](#find-match "mention"). Удаление членства после этого отменит подбор для всей группы.

{% hint style="info" %}
После отмены подбора участники [автоматически удаляются из подбора](#matchmaking-profiles) и получают уведомление через членство `status:CANCELLED`  в своём следующем ответе опроса статуса.
{% endhint %}

После отмены, если группа хочет перезапустить подбор, владелец группы должен заново создать группу, передать новый ID группы участникам, а затем заставить их заново создать свои членства.

**После того как матч найден, группу нельзя удалить** (`409 Conflict`), и она будет [удалена автоматически](#connect-to-server). Ваш сервер должен дать игрокам некоторое время (например, 60 с) на подключение, прежде чем считать игрока покинувшим очередь. В таком случае ваш сервер может:

* заменить вышедшего игрока ИИ-персонажем, чтобы немедленно начать матч,
* или создать [backfill](#backfill-match) чтобы найти нового игрока на замену ушедшему,
* или продолжить без замены ушедшего игрока, если дизайн вашей игры допускает переменное число игроков.

### Найти матч

Чтобы начать поиск матча, все участники и владелец должны отметить себя готовыми.

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

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

**Все игроки должны регулярно опрашивать своё членство** (рекомендуется каждые 3-5 с), чтобы определить, когда начинается подбор игроков, и сообщать о ходе подбора через внутриигровой интерфейс.

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

Как только мы найдём достаточно игроков, чтобы собрать их в одну команду в соответствии с вашим [#matchmaking-rules](#matchmaking-rules "mention"), игроки получат уведомление в ответе по своему членству с `status:TEAM_FOUND`.

Удаление членства на этом этапе приведёт к отмене всех членств группы, а все другие группы, назначенные в ту же команду, вернутся к `status:SEARCHING` .

Команды продолжают подбор с другими командами, используя совпадающие значения между своими группами (или среднее значение в случае `number_difference` ), пока не будут собраны достаточные команды. Членства указывают это ответом  `status:MATCH_FOUND` , что означает, что ваше [развертывание запускается](https://docs.edgegap.com/ru/orkestraciya/deployments#id-1.-start-a-deployment).

**Matchmaker стремится максимизировать заполнение матча и не перейдёт к `MATCH_FOUND` пока не выполнится одно из условий:**

1. достаточное количество команд подобрано с настроенным максимальным размером команды,
2. или если [#rule-expansion](#rule-expansion "mention") определено И достигнуто время расширения, И достаточное количество команд подобрано с настроенным минимальным размером команды,
3. или истёк настроенный срок жизни тикета И достаточное количество команд подобрано с настроенным минимальным размером команды.

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

{% hint style="info" %}
Столкнулись с долгим ожиданием в очереди во время тестирования или с игроками из менее популярных регионов? Установите более короткий срок жизни тикета (например, 30 с) и заново создавайте группу (или тикеты) на стороне клиента по истечении срока.
{% endhint %}

Срок жизни тикета автоматически сбрасывается всякий раз, когда группа (или игрок) назначается в команду.

{% hint style="success" %}
Сохраните `team_id`  и `match_id` в вашем игровом бэкенде, чтобы отображать информацию об участниках команды в игре.
{% endhint %}

{% hint style="info" %}
Каждый игрок получает **уникальный ID тикета, который можно использовать для** [#authenticate](#authenticate "mention") **с игровыми серверами.**
{% endhint %}

Если игрок был подобран и назначен на игровой сервер, его тикет удаляется автоматически. Игроки, покинувшие очередь после `status:HOST_ASSIGNED`  могут быть заменены [backfill](#backfill-match).

Как только игроки получают `status:HOST_ASSIGNED`  они переходят к [#connect-to-server](#connect-to-server "mention").

### Подключиться к серверу

### Подбор при заполнении

После завершения инициализации игрового сервера **ваш сервер должен**:

* **Запустить таймер покидания для каждого нового игрока.** Мы рекомендуем показывать подключённым игрокам ход загрузки с помощью сцены/уровня загрузки — полноценной 3D-сцены, социального интерфейса в стиле лобби или экрана загрузки с полосой прогресса.
* **Отслеживайте новые подключения игроков или уходящих со временем существующих игроков**:
  1. Новые игроки должны сообщить серверу ID тикета для аутентификации и чтобы сопоставить своё соединение с matchmaker [#injected-variables](#injected-variables "mention") или `assigned_ticket` (если выполнен backfill).
  2. Создавайте новые backfill для неиспользуемой ёмкости игроков (ушедших) на протяжении всего времени жизни сервера.
  3. Обновляйте просроченные backfill, которые удаляются после `ticket_expiration_period`.
* **Очистите (удалите) все оставшиеся backfill** когда [#id-5.-deployment-stopped](https://docs.edgegap.com/ru/orkestraciya/deployments#id-5.-deployment-stopped "mention"):
  * Unity - [`OnApplicationQuit`](https://docs.unity3d.com/6000.0/Documentation/ScriptReference/MonoBehaviour.OnApplicationQuit.html) колбэк или пользовательский колбэк завершения игры,
  * Unreal Engine - [`OnWorldDestroyed`](https://forums.unrealengine.com/t/call-function-before-quit-game/344954/2) , [`PreExit`](https://forums.unrealengine.com/t/event-on-close/298087/2) , или пользовательский колбэк завершения игры.

Для backfill можно использовать любой профиль, если указано корректное назначение сервера и предоставлен хотя бы один тикет. См. [#backfill-showcase](https://docs.edgegap.com/ru/learn/podbor-igrokov/..#backfill-showcase "mention") для минимального примера.

## ⚙️ Конфигурация

API Matchmaker генерируется из JSON-конфигурации, указанной при создании нового (или при быстром перезапуске) Matchmaker. Вы можете указать любое количество профилей с разными правилами и расширениями:

{% hint style="success" %}
См. [](https://docs.edgegap.com/ru/learn/podbor-igrokov "mention") наши SDK и подробные примеры сценариев.
{% endhint %}

{% hint style="warning" %}
Изменение работающего matchmaker **вызовет быстрый перезапуск**, удалив все тикеты и вызвав кратковременный простой.
{% endhint %}

### Профили (очереди) <a href="#matchmaking-profiles" id="matchmaking-profiles"></a>

Профили представляют собой полностью отдельные очереди подбора игроков, использующие одну и ту же версию matchmaker. Вы можете **настроить любое количество профилей для каждого matchmaker.** Разделение базы игроков на несколько профилей может привести к более длительному ожиданию в очереди для ваших игроков.

Каждый профиль matchmaker использует [Версию приложения](https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions) как шаблон для запуска новых развертываний (серверов).

{% hint style="success" %}
Некоторые игровые режимы могут требовать больше vCPU / RAM, особенно если они поддерживают большее количество игроков. Каждый **matchmaker может включать несколько профилей**, каждый из которых связан с версией приложения с настроенными ресурсами.
{% endhint %}

### Правила <a href="#matchmaking-rules" id="matchmaking-rules"></a>

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

Каждая запись в профиле по пути `.rules.initial` представляет собой правило, где:

* **key** — это строковое значение, задающее имя правила так, как вам удобно; например, `match_size` , а
* **value** — это объект, определяющий тип и атрибуты правила в соответствии с нашим стандартным набором правил.

{% hint style="info" %}
Все правила должны выполняться одновременно, чтобы инициировать назначение хоста и начать или найти развертывание.
{% endhint %}

**Операторы (тип правила)**

**`player_count`** — это специальное правило, определяющее, сколько игроков нужно сопоставить для начала назначения.

{% hint style="warning" %}
Правило `player_count`  **обязательно и может быть определено только один раз** в ваших начальных правилах конфигурации.
{% endhint %}

Matchmaker всегда стремится максимизировать заполнение матча, вплоть до указанного `max_team_size` :

1. если достигнут максимальный размер команды, матч создаётся немедленно,
2. иначе игроки ждут в очереди, чтобы заполнить матч, пока [расширение](#rule-expansion) (или истечение срока) не наступит,
3. незадолго до [расширения](#rule-expansion) (или истечения срока), если возможен частичный матч (≥ min и < max team size), этот матч будет создан со всеми игроками на одной и той же стадии расширения (при условии прохождения других правил).

{% hint style="success" %}
Для кооперативных, free-for-all или асимметричных режимов с размером команды установите `"team_count": 1` .
{% endhint %}

Количество команд можно настроить, чтобы формировать несколько сбалансированных команд для соревновательных игр:

* **атрибуты группы вычисляются как среднее/перекрытие** атрибутов **игроков группы,**
* **атрибуты команды вычисляются как среднее/перекрытие** атрибутов **групп команды.**

Предполагая фиксированный размер команды в 4 игрока:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FSFEzBayk3XNEUTIynjNd%2Fimage.png?alt=media&#x26;token=11a43fdf-3a99-4caa-8d2b-639e0f3cc06f" alt=""><figcaption><p>Примеры сценариев матча</p></figcaption></figure>

{% hint style="info" %}
**Группы сопоставляются в команды без переполнения,** только если в команде достаточно места для всей группы.
{% endhint %}

**`string_equality`** сопоставляет игроков с точно таким же строковым значением.

<details>

<summary>Пример правила: <code>selected_game_mode</code></summary>

`selected_game_mode`  правило будет сопоставлять игроков с учётом регистра:

:white\_check\_mark: Alice + Bob + Dave могут совпасть,

:x: Alice + Erin или Charlie + Frank никогда не совпадут.

| "Free For All" | "Capture The Flag" | "capture the flag" |
| -------------- | ------------------ | ------------------ |
| Alice          | Erin               | Frank              |
| Bob            | Charlie            |                    |
| Dave           |                    |                    |

</details>

**`number_difference`** сопоставляет игроков в пределах абсолютной числовой разницы между ними.

<details>

<summary>Пример правила: <code>elo_rating</code></summary>

`elo_rating`  правило выше с `"max_difference": 50` изначально:

:white\_check\_mark: Alice + Bob могут совпасть, или Bob + Charlie могут совпасть,

:x: Alice + Bob + Charlie никогда не совпадут.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FxtTxZ7TPSa8a8WtnGNAE%2Fimage.png?alt=media&#x26;token=c48b843b-c4e5-47bf-9154-07254a788067" alt=""><figcaption></figcaption></figure>

</details>

**`intersection`** сопоставляет игроков с одним или несколькими перекрывающимися строковыми значениями, с учётом регистра.

<details>

<summary>Пример правила: <code>selected_map</code></summary>

`selected_map` правило выше с `"overlap": 1`  будет сопоставляться:

:white\_check\_mark: Alice + Bob + Charlie могут совпасть, или Alice + Bob + Dave могут совпасть,

:x: Alice + Bob + Charlie + Dave никогда не совпадут.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FcQSUAnRkZKVyuGjFWSYL%2Fimage.png?alt=media&#x26;token=bf1a4e28-230a-4c9a-9ef6-a0dea4dbecdb" alt=""><figcaption></figcaption></figure>

</details>

#### Расширение правил

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

<details>

<summary>Пример сценария: расширения</summary>

[Изначально требуется 1 команда, состоящая ровно из 4 игроков (возможно, разделённых по группам)](https://docs.edgegap.com/ru/learn/podbor-igrokov/..#advanced-example) с:

* максимум 125 мс задержки относительно одного и того же (любого одного) beacon,
* разницей задержки 125 мс или меньше между минимальным и максимальным значением для одного и того же beacon,
* разницей рейтинга навыка 50 очков или меньше между игроком с самым низким и самым высоким рейтингом,
* точно таким же (с учётом регистра) выбранным игровым режимом,
* как минимум одним совпадающим выбором карты (с учётом регистра) среди игроков,
* как минимум одним совпадающим [размером backfill группы](#backfill-match) значением среди игроков.

В приведённом выше примере мы **расширяем поиск, изменяя атрибуты** после:

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>30 секунд:</td><td><ul><li>4 игроков</li><li><strong>диапазон рейтинга навыка 150</strong></li><li><strong>макс. задержка 250 мс</strong></li></ul></td></tr><tr><td>60 секунд:</td><td><ul><li>4 игроков</li><li><strong>диапазон рейтинга навыка 200</strong></li><li>макс. задержка 250 мс</li></ul></td></tr><tr><td>3 минуты (180 с):</td><td><ul><li><strong>1-4 игрока</strong></li><li>диапазон рейтинга навыка 200</li><li><strong>любая задержка</strong></li></ul></td></tr></tbody></table>

</details>

<details>

<summary>Точная настройка расширений</summary>

Предсказание предпочтений игроков похоже на стрельбу по движущейся мишени. Начните с менее строгого набора правил при релизе, а затем оптимизируйте его поэтапно с [#analytics](#analytics "mention").

Эти вопросы могут помочь структурировать ваш мыслительный процесс:

* Какова длительность моей игровой сессии?
  * 5-минутная игровая сессия означает, что каждый игрок снова попадает в очередь каждые 5 минут, что косвенно уменьшит время ожидания, поскольку в любой момент в очереди будет больше игроков.
* Каков мой [пиковый CCU](#user-content-fn-2)[^2] и мой [низкий CCU](#user-content-fn-3)[^3]?
  * Если между низким и высоким значением высокая разница (более 60%), вам может понадобиться отдельный профиль для периода спада, чтобы дольше ждать на каждом расширении и накапливать больше игроков.
* Каково географическое распределение моих игроков?
  * Равномерное распределение по нескольким часовым поясам означает, что у пика и спада меньшая вариативность, но не ускоряет подбор, поскольку игроки из разных регионов не должны совпадать, если ваш [#ping-optimization](#ping-optimization "mention") настроен правильно (иначе получится высокий пинг).
* Каково распределение рейтинга навыка моих игроков (по регионам)?
  * Распределение навыка обычно следует [кривой Гаусса](https://www.simplypsychology.org/normal-distribution.html) (нормальному распределению), поэтому на каждом стандартном отклонении от среднего вы находите всё меньше игроков, удалённых от среднего. Игроки со средними значениями будут подобраны быстро, на первом расширении, но крайние значения — проблема.
  * Мы рекомендуем увеличивать величину допустимой разницы с каждым расширением, например 25 -> 50 -> 100, чтобы учитывать меньшее число игроков на краях кривой.
  * Если у вас есть игроки любого challenger-tier (профессионалы), мы рекомендуем отдельный профиль с собственной настройкой навыка, поскольку выборка меньше и часто не следует общему тренду по всей базе игроков. (смещение к экстремумам, перевёрнутая кривая Гаусса)
* Как улучшить скорость подбора и заполнение матча при небольшой базе игроков?
  * Узнайте как можно больше о своих игроках и их предпочтениях!
  * Рассмотрите возможность убрать некоторые правила или изначально ослабить ограничения.
  * Со временем ослабляйте размер команды или количество команд — частичный матч лучше, чем отсутствие матча.
  * Увеличьте интервал между расширениями, чтобы накапливать больше игроков.
  * Свяжитесь с нами за дополнительными советами и приёмами, специально для дизайна вашей игры.

</details>

{% hint style="info" %}
Расширения любого атрибута правила **перезапишут предыдущие значения** этого атрибута.
{% endhint %}

## 📌 Внедрённые переменные

Вашему серверу могут понадобиться сведения о своих игроках. Атрибуты игроков, рассчитанные значения матча и другие значения внедряются в ваше развертывание вместе с обычными [#injected-variables](https://docs.edgegap.com/ru/orkestraciya/application-and-versions#injected-variables "mention").

Предпросмотр без форматирования **🏁 Дополнительные примерные переменные:**

```
MM_MATCH_PROFILE=advanced-example
MM_EXPANSION=initial
MM_TICKET_IDS=["cusfn10msflc73beiik0","cusfn18msflc73beiil0"]
MM_TICKET_cusfn10msflc73beiik0={"id":"cusfn10msflc73beiik0","created_at":"2025-02-21T22:17:42.3886970Z","player_ip":"174.93.233.25","group_id":"b2080c27-19c9-4fb0-8fe7-4bf1e5d285d1","team_id":"cusfn1gmsflc73beiim0","attributes":{"beacons":{"Chicago":12.3,"LosAngeles":145.6,"Tokyo":233.2},"elo_rating":1337,"selected_game_mode":"quickplay","selected_map":["DustII","Airport","BankVault"],"backfill_group_size":["new","1"]}}
MM_TICKET_cusfn18msflc73beiil0={"id":"cusfn18msflc73beiil0","created_at":"2025-02-21T22:17:42.2548390Z","player_ip":"174.93.233.23","group_id":"015d4dc8-6c79-4b5c-bbc6-f309b9787c8f","team_id":"cusfn1gmsflc73beiim0","attributes":{"beacons":{"Chicago":87.3,"LosAngeles":32.4,"Tokyo":253.2},"elo_rating":1339,"selected_game_mode":"quickplay","selected_map":["Island","Airport"],"backfill_group_size":["new","1"]}}
MM_GROUPS={"b2080c27-19c9-4fb0-8fe7-4bf1e5d285d1":["cusfn10msflc73beiik0"],"015d4dc8-6c79-4b5c-bbc6-f309b9787c8f":["cusfn18msflc73beiil0"]}
MM_TEAMS={"cusfn1gmsflc73beiim0":["b2080c27-19c9-4fb0-8fe7-4bf1e5d285d1","015d4dc8-6c79-4b5c-bbc6-f309b9787c8f"]}
MM_MATCH_ID=advanced-example_initial-2025-02-21T22:17:43.3886970Z
MM_INTERSECTION={"selected_map":["Airport"],"backfill_group_size":["new","1"]}
MM_EQUALITY={"selected_game_mode":"quickplay"}
```

{% hint style="info" %}
Переменные окружения **хранятся в виде JSON-строк**, парсите их с помощью нашего SDK или собственного метода.
{% endhint %}

{% hint style="success" %}
**Серверы могут сопоставлять подключения игроков с группами и атрибутами** после того как игрок отправит свой ID тикета на сервер.
{% endhint %}

## 🧵 Трассировка игроков

Если у ваших игроков возникают проблемы, полезно отслеживать их путь до серверных логов. Каждый Matchmaker **развертывание** **будет помечено назначенными ID тикетов игроков** чтобы вы могли легко [#filter-deployments](https://docs.edgegap.com/ru/orkestraciya/deployments#filter-deployments "mention") и находить [#container-logs](https://docs.edgegap.com/ru/orkestraciya/deployments#container-logs "mention") для помощи в устранении неполадок.

{% hint style="success" %}
**Отображайте ID тикетов и ID развертываний в интерфейсе истории матчей клиента** чтобы отслеживать игроков при устранении неполадок.
{% endhint %}

{% hint style="info" %}
См. [#connection-quality](https://docs.edgegap.com/ru/orkestraciya/deployments#connection-quality "mention") чтобы узнать об устранении неполадок с развертыванием.
{% endhint %}

## 👀 Аналитика

Получайте сведения о нагрузке и производительности вашего matchmaker — без кода и без необходимости настройки.

🌟 [**Обновите Matchmaker до Enterprise Tier**](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list) **чтобы открыть метрики и аналитические сведения о подборе игроков:**

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fhb8NmB4ELuG7ayGLTeHs%2Fimage.png?alt=media&#x26;token=e3e0371e-c33f-48c8-bd15-5c11448dc633" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fl0zTNccJASUTkJfTYxss%2Fimage.png?alt=media&#x26;token=0d061320-9524-4b12-83e6-ea9112ef1409" alt=""><figcaption></figcaption></figure>

## ☁️ Хостинговый кластер

Matchmaker удобно размещается и управляется Edgegap 24/7 без перерывов.

Выберите вариант хостинга, который лучше всего подходит для вашей цели:

#### Тарифы приватного кластера

Обновите до приватного кластера в один клик. Также возможно изменить тарифы приватного кластера после запуска без простоя для игроков с [#rolling-updates-and-ab-tests](#rolling-updates-and-ab-tests "mention"). Управляемые кластеры предоставляют высокодоступный хостинг сервисов, поддерживаемый Edgegap, с круглосуточной живой поддержкой для публично выпущенных игр.

Требования к ресурсам для вашего экземпляра будут зависеть от факторов:

* **количество игроков** - больше игроков приводит к большему числу тикетов и API-запросов,
* **количество запросов на игрока** - более частые повторные попытки увеличивают нагрузку на сервис и потребляют ресурсы,
* **сложность конфигурации** - правила пересечения и расширения особенно требовательны,
* **средняя длительность матча** - более короткие сессии заставляют игроков чаще возвращаться в подбор,
* **сроки истечения и удаления** - устаревшие тикеты накапливаются со временем и потребляют ресурсы,
* **логика повторных попыток клиента с fallback** - повторные попытки с jittered backoff помогают распределять пики всплесков трафика.

{% hint style="warning" %}
**Подготовьтесь к успеху и оптимизируйте после запуска, чтобы не блокировать игроков в день релиза.** Используйте [#matchmaking-sdk](https://docs.edgegap.com/ru/unity/developer-tools#matchmaking-sdk "mention") или **реализуйте экспоненциальный jittered backoff** для восстановления после высокой нагрузки.
{% endhint %}

### Ограничения скорости

Чтобы защитить ваш кластер от превышения его пиковых возможностей и сбоев, мы ограничиваем число запросов в секунду на основе наших внутренних нагрузочных тестов, используя [#advanced-example](https://docs.edgegap.com/ru/learn/podbor-igrokov/..#advanced-example "mention") конфигурацию.

<table><thead><tr><th>Конечная точка API</th><th width="130">Бесплатный тариф</th><th width="130">Тариф для любителей</th><th width="130">Студийный тариф</th><th width="130">Корпоративный тариф</th></tr></thead><tbody><tr><td><strong>Общий лимит</strong></td><td><strong>100</strong></td><td><strong>200</strong></td><td><strong>750</strong></td><td><strong>2,000</strong></td></tr><tr><td>Создать развертывание</td><td>5</td><td>10</td><td>30</td><td>30</td></tr><tr><td>Получить список маяков</td><td>10</td><td>20</td><td>75</td><td>200</td></tr><tr><td>Создать группу<br>+ Создать тикет<br>+ Создать групповой тикет</td><td>10</td><td>20</td><td>75</td><td>200</td></tr><tr><td>Читать членство<br>+ Читать группу<br>+ Читать тикет</td><td>10</td><td>120</td><td>450</td><td>1,300</td></tr><tr><td>Создать обратное заполнение</td><td>5</td><td>10</td><td>37</td><td>100</td></tr></tbody></table>

Ограничения по скорости выражаются в **совокупном количестве запросов в секунду к указанному набору конечных точек API**.

Если ваши игровые клиенты не повторяют запросы при получении ответа `429 Слишком много запросов`  **в ваших развертываниях могут отсутствовать игроки** которые перестают читать свои назначения из-за высокой нагрузки.

#### Нагрузочное тестирование

Матчмейкинг и назначения требуют использования CPU и памяти, что влечет за собой стоимость хостинга для каждого частного матчмейкера. См. ресурсы и цены, связанные с каждым тарифом, на [нашей странице цен](https://edgegap.com/resources/pricing#matchmaker).

{% hint style="success" %}
**Всегда используйте** [**частные кластеры**](#private-cluster-tiers) **для стресс-тестирования.** Бесплатные матчмейкеры строго ограничены и предназначены только для dev-тестирования.
{% endhint %}

При проектировании нагрузочного теста **пожалуйста, учитывайте реалистичные модели поведения игроков**:

| Реалистичный сценарий                                                                                               | Нереалистичный шаблон трафика                                                                          |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| ✅ Игроки постепенно подключаются к матчмейкингу, увеличивая req/s в течение нескольких часов.                       | ❌ Все игроки координируются и создают свои тикеты в одну и ту же секунду.                              |
| ✅ Игроки ждут все больше времени между повторными попытками (например, 1 с - 5 с - 10 с - 10 с).                    | ❌ Все игроки повторяют попытку сразу после получения `429 Слишком много запросов`  ответа.             |
| ✅ Большинство игроков получат свои назначения в течение короткого времени (10–60 с) и перестанут опрашивать сервер. | ❌ Все игроки продолжают опрашивать сервер в течение заданного времени даже после получения назначения. |
| ✅ Большинство игроков заканчивают свою игру (это занимает время), прежде чем снова начать матчмейкинг.              | ❌ Все игроки сразу же заново запускают матчмейкинг после получения назначения.                         |
| ✅ Пиковый трафик сохраняется 6–8 часов в день, после чего в некоторых часовых поясах он снижается.                  | ❌ Пиковый трафик сохраняется 24 часа в сутки, все игроки играют днем и ночью.                          |

Если матчмейкер испытывает высокую нагрузку:

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

## ⏩ Пошаговые обновления <a href="#rolling-updates-and-ab-tests" id="rolling-updates-and-ab-tests"></a>

Отслеживание совместимости между версиями сервера и клиента может быть сложным. Следуйте нашим советам для надежных релизов, обновлений и предотвращения простоя или проблем совместимости.

**URL вашего матчмейкера и токен аутентификации всегда останутся прежними после перезапуска.**

{% hint style="danger" %}
**Создавайте отдельные матчмейкеры для dev и production** сред, чтобы безопасно экспериментировать.
{% endhint %}

#### ⚠️ **Перед выходом в продакшен**

Мы рекомендуем заранее создать несколько копий вашего матчмейкера: `green`, `blue` и `orange`. Вы можете переключать, какой матчмейкер используется, по мере выпуска обновлений ([blue/green-стратегия](https://en.wikipedia.org/wiki/Blue%E2%80%93green_deployment)).

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

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Flzy4elHYDPBMpjSMG1HS%2Fimage.png?alt=media&#x26;token=7da795fc-ae6c-490f-b65c-5f8dda635503" alt=""><figcaption><p>Пример DevOps-среды Blue/Green</p></figcaption></figure>

#### **🔃 Обновление клиента + сервера**

**Предварительные требования:** В этом разделе предполагается, что вы завершили [#before-going-live](#before-going-live "mention").

Чтобы **выпускать обновления игрового клиента + сервера**, вы можете:

1. Подготовить новую версию серверного приложения `v1.2.0-rc` в Edgegap:
   1. отправить новый тег образа в ваш container registry `t1.2.0`,
   2. создать новую версию приложения `v1.2.0-rc`,
2. Выполнить любые dev-тесты, [развернув новую версию приложения](https://app.edgegap.com/deployment-management/deployments/list) `v1.2.0-rc`:
   1. подключив редактор вашего игрового движка к предоставленному URL + внешнему порту,
3. Обновить неиспользуемый матчмейкер `blue` чтобы привязать его к новому тегу образа `t1.2.0`,
   1. включить кэширование для новой версии приложения `v1.2.0-rc` , включение кэша для этой версии обеспечит также кэширование образа для версии `v-blue`  поскольку они ссылаются на один и тот же тег,
   2. дождаться, пока индикатор кэширования в версии `v1.2.0-rc`  достигнет :green\_circle: green,
4. Обновить новый игровой клиент `c2` чтобы использовать новую версию `v-blue` при создании тикетов:
   1. обновите базовый URL и токен авторизации в игровом клиенте,
5. Выполнить QA-тесты и финальные проверки нового игрового клиента `c2`:
   1. если вы обнаружите и устраните какие-либо проблемы, повторите процесс с начала,
   2. подождите 3–7 дней, чтобы изменения DNS матчмейкера распространились на провайдеров по всему миру, после того как матчмейкер был остановлен (быстрый перезапуск не требует обновления DNS или периода ожидания),
6. Выпустите обновление нового игрового клиента `c2` на платформах распространения игр,
7. Дайте время новому игровому клиенту `c2` распространиться на устройства игроков (обычно до 3–7 дней):
   1. следите за устаревшими игровыми клиентами `c1`  используя развертывание [#analytics](https://docs.edgegap.com/ru/orkestraciya/deployments#analytics "mention"),
8. Очистите неиспользуемые ресурсы в вашей учетной записи Edgegap:
   1. удалите тег образа `t1.0.0` чтобы освободить место в Container Registry,
   2. удалите тег образа `t1.1.0` чтобы освободить место в Container Registry,
   3. отключите свой `green`  матчмейкер, чтобы приостановить биллинг до следующего обновления.

{% hint style="success" %}
**Для вашего следующего обновления**, увеличьте номера версий и замените `green` и `blue` ключевые слова в руководстве.
{% endhint %}

#### **⚡ Срочный серверный патч**

**Предварительные требования:** В этом разделе предполагается, что вы завершили [#before-going-live](#before-going-live "mention").

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

1. Подготовить новую версию серверного приложения `v1.2.0-rc` в Edgegap:
   1. отправить новый тег образа в ваш container registry `t1.2.0`,
   2. создать новую версию приложения `v1.2.0-rc`,
2. Выполните тесты и проверки, [развернув новую версию приложения](https://app.edgegap.com/deployment-management/deployments/list) `v1.2.0-rc`:
   1. подключив редактор вашего игрового движка к предоставленному URL + внешнему порту,
   2. если вы обнаружите и устраните какие-либо проблемы, повторите процесс с начала,
   3. включить кэширование для новой версии приложения `v1.2.0-rc` , включение кэша для этой версии обеспечит также кэширование образа для версии `v-green`  позже, поскольку они будут ссылаться на тот же тег,
   4. дождаться, пока индикатор кэширования в версии `v1.2.0-rc`  достигнет :green\_circle: green,
3. Обновить версию `v-green`  чтобы привязать его к новому тегу образа `t1.2.0`,
   1. новые матчи будут автоматически запускать назначение с обновленным тегом `t1.2.0`,
   2. следите за устаревшими игровыми клиентами `c1`  используя развертывание [#analytics](https://docs.edgegap.com/ru/orkestraciya/deployments#analytics "mention"),
4. Очистка неиспользуемых ресурсов в вашей учетной записи Edgegap:
   1. удалите тег образа `t1.1.0` чтобы освободить место в Container Registry.

## 📗 API <a href="#matchmaking-api" id="matchmaking-api"></a>

Клиенты и серверы могут вызывать API напрямую или с помощью SDK игрового движка, см. также [](https://docs.edgegap.com/ru/learn/podbor-igrokov "mention").

### Сервер к серверу <a href="#server-to-server-api" id="server-to-server-api"></a>

Добавьте расширенные или настраиваемые элементы управления потоком матчмейкинга — реализуйте собственный прокси с помощью нашего [managed-clusters](https://docs.edgegap.com/ru/learn/advanced-features/managed-clusters "mention") или любой облачной FaaS[^4] вычислительной платформы, чтобы добиться любого из следующего:

* прикрепить чувствительные атрибуты игрока — такие как флаги читера, рейтинги навыка или подобные,
* предоставить контекст команды и матча в игре — показывать моих товарищей по команде и противников во время загрузки,
* ограничить особые случаи — например, разрешать только 1 группу на игрока в любой момент времени,
* добавить кэширование или ограничение частоты API — уменьшить количество запросов и нагрузку на матчмейкер,
* настроить интеграцию лобби-группы — создавать асимметричные/ролевые лобби перед матчмейкингом.

{% hint style="success" %}
**Включите параметр `player_ip`  с публичным IP-адресом участника** чтобы обеспечить максимально возможную задержку для игрока и воспользоваться преимуществами [#id-1.-server-score-strategy-best-practice](https://docs.edgegap.com/ru/orkestraciya/deployments#id-1.-server-score-strategy-best-practice "mention").
{% endhint %}

{% hint style="info" %}
Игровые клиенты могут использовать [ipify.org](http://ipify.org/) бесплатный сервис для определения своего публичного IP. VPN могут скрывать публичный IP-адрес.
{% endhint %}

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FzLfA3fEBgwaziGtp2yMO%2Fimage.png?alt=media&#x26;token=3d551e74-4a60-47a6-9d79-a506f961663d" alt=""><figcaption><p>Диаграмма активности матчмейкинга сервер-сервер</p></figcaption></figure>

#### Cross-Origin Resource Sharing (CORS)

Для webGL-игр, размещенных на сторонних платформах распространения (например, [itch.io](http://itch.io/)), отправка любых запросов к Matchmaker из игрового клиента может привести к [Cross-Origin Resource Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) нарушениям политики. Большинство современных веб-браузеров отправляют [pre-flight request](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request) чтобы проверить, что серверный сервис (Matchmaker) понимает и принимает связь от вашего игрового клиента.

Неудачная pre-flight проверка (по умолчанию по соображениям безопасности) может привести к [одной из нескольких возможных ошибок, связанных с CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin), чаще всего `заголовок CORS 'Access-Control-Allow-Origin' отсутствует` .

Чтобы устранить эту ошибку, добавьте **`allowed_cors_origin`** параметр в вашу конфигурацию, чтобы либо:

* внести в белый список точные домены хостинга вашего клиента:

<details>

<summary>🍀 Простой пример (пример с конкретными доменами)</summary>

<pre class="language-json"><code class="lang-json">{
  "version": "3.2.0",
  "allowed_cors_origins": [
    "https://dev.my-game-server.com",
    "https://prod.my-game-server.com"
  ],
  "profiles": {
      <a data-footnote-ref href="#user-content-fn-5">...</a>
  }
}
</code></pre>

</details>

* или внести в белый список домен с подстановочным знаком (включая все поддомены):

<details>

<summary>🍀 Простой пример (пример с доменом-подстановкой)</summary>

<pre class="language-json"><code class="lang-json">{
  "version": "3.2.0",
  "allowed_cors_origins": ["https://*.my-game-server.com"],
  "profiles": {
      <a data-footnote-ref href="#user-content-fn-5">...</a>
  }
}
</code></pre>

</details>

{% hint style="info" %}
**Для pre-flight запросов Matchmaker учетные данные не требуются**, если домены настроены правильно.
{% endhint %}

## 🚨 Устранение неполадок

**Ваш успех — наш приоритет.** Если вы хотите отправить пользовательские запросы, попросить о недостающих критически важных функциях или поделиться любыми мыслями, [пожалуйста, свяжитесь с нами в нашем Community Discord](https://discord.gg/MmJf8fWjnt).

<details>

<summary>Почему при попытке создать новый матчмейкер я получаю ошибки?</summary>

* Пожалуйста, прочитайте сообщение об ошибке: возможно, вы неправильно написали идентификатор, правило или оператор. — Используйте [JSONLint](https://jsonlint.com/) чтобы проверить форматирование JSON, возможно, вы пропустили запятую или скобку. — Обратитесь через [наш Community Discord](https://discord.gg/MmJf8fWjnt) за помощью, мы будем рады помочь. 🙏

</details>

<details>

<summary>Почему мой матчмейкер автоматически выключился через 3 часа?</summary>

* Матчмейкеры в Free Tier предназначены для первоначальных тестов и автоматически выключаются через 3 часа. Чтобы продолжить тестирование, вы можете [перезапустить ваш матчмейкер](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).
* Рассмотрите возможность перехода на платный тариф для неограниченного времени работы.

</details>

<details>

<summary>Почему я не могу запустить второе развертывание в своей учетной записи?</summary>

* В Free Tier вы можете запускать только 1 одновременное развертывание.
* Пожалуйста, рассмотрите возможность перехода на платный тариф для неограниченного числа развертываний.

</details>

<details>

<summary>Почему я получаю назначение/развертывание в случайные моменты, игнорируя <code>player_count</code>?</summary>

* Вы или другой участник команды могли создать тикеты во время предыдущей тестовой сессии, которые не были назначены. Пожалуйста, [перезапустить ваш матчмейкер](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).

</details>

<details>

<summary>Мой тикет застрял в <code>SEARCHING</code> .</summary>

* Пожалуйста, проверьте, что вы создали достаточное количество совпадающих тикетов, соответствующих вашей конфигурации.

</details>

<details>

<summary>Мой тикет застрял, переключаясь между <code>MATCH_FOUND</code> и <code>TEAM_FOUND</code> повторно.</summary>

* Учетные записи Free Tier ограничены 1 развертыванием одновременно.
* Пожалуйста, рассмотрите возможность обновления тарифа или остановите текущее развертывание, чтобы начать новое.

</details>

<details>

<summary>Мой тикет сразу переходит в <code>CANCELLED</code>.</summary>

* Срок действия вашего тикета истек. Создайте новый тикет или увеличьте период истечения в вашей конфигурации для тестирования.

</details>

<details>

<summary>Я получаю <code>HTTP 404 Not Found</code> при проверке моего тикета.</summary>

* Ваш тикет был удален либо запросом DELETE, либо по достижении периода удаления (начинается после истечения срока действия тикета, определен в вашей конфигурации). Создайте новый тикет повторно или увеличьте периоды истечения/удаления в вашей конфигурации для тестирования.

</details>

<details>

<summary>Мой матчмейкер показывает ошибку, что мне делать?</summary>

* Если это экземпляр для разработки или тестирования, сначала попробуйте перезапустить ваш матчмейкер. — Пожалуйста, сообщайте о любых проблемах через [наш Community Discord](https://discord.gg/MmJf8fWjnt).
* Если эта проблема влияет на живую игру, создайте [срочный запрос в поддержку](https://edgegap.atlassian.net/servicedesk/customer/portal/3).

</details>

## 🔖 Журнал изменений

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

{% hint style="info" %}
**Последняя версия матчмейкера — `3.2.2`**. Все примеры на этой странице актуальны. Следите за уведомлениями о прекращении поддержки вашей версии матчмейкера. См. также [#rolling-updates-and-ab-tests](#rolling-updates-and-ab-tests "mention").
{% endhint %}

#### 3.2.2 (18 мар. 2025)

🩹 **Исправления ошибок:**

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

{% hint style="success" %}
**Это последняя версия сервиса матчмейкера, рекомендуемая для использования в production.**
{% endhint %}

{% hint style="warning" %}
**Чтобы обновить версию матчмейкера — Stop, Edit, Restart.** Quick Restart не применит изменения версии.
{% endhint %}

#### 3.2.1 (24 нояб. 2025)

🩹 **Исправления ошибок:**

* Небольшие исправления ошибок развертывания, устранено несколько ошибок при запуске вашего матчмейкера.

#### 3.2.0 (31 окт. 2025)

🩹 **Исправления ошибок:**

* Различные мелкие исправления спецификации и обновления для согласованности документации.
* Различные исправления стабильности и самовосстановления в инфраструктуре матчмейкера.

**✨ Улучшения и новые функции:**

* **Представляем** [#group-up](#group-up "mention") **функцию** - управление группами теперь стало простым и не требует сторонних сервисов!
  * Больше не нужно делиться сложными атрибутами тикетов между участниками группы, вам нужен только Group ID.
  * Начинайте матчмейкинг как группа, когда все игроки отметят себя как готовые.
  * Проверяйте атрибуты участников группы относительно лидера группы при присоединении, предотвращая группы, которым невозможно подобрать матч (атрибуты игроков группы не будут соответствовать правилам профиля).
  * Проверяйте размер группы и отклоняйте новые участия, когда достигнут максимальный размер команды.
  * Читайте нашу обновленную документацию с новым пользовательским потоком, скоро появятся обновления SDK!
* Тикеты (членства) теперь включают ID вашего матча — отслеживайте игроков и добавляйте элементы интерфейса, чтобы показывать названия вашей команды или команд соперников, рейтинг навыка или другие свойства, хранящиеся у третьих сторон.
* Масштабное [#rate-limits](#rate-limits "mention") переработано на основе внутреннего стресс-тестирования, лучшее управление короткими всплесками.
* Улучшена скорость заполнения матчей за счет отложенного формирования частичных матчей до конца расширения.
  * Если достигнут максимальный размер команды, матч создается немедленно.
  * Иначе матч создается в конце текущего расширения, если достигнут минимальный размер команды.
* Задавайте периоды истечения и удаления для каждого профиля и оптимизируйте для лучшего опыта игроков.

{% hint style="warning" %}
Чтобы обновить вашу конфигурацию, увеличьте версию и скопируйте поля истечения и удаления в каждый профиль.
{% endhint %}

#### 3.1.0 (10 июня 2025)

🩹 **Исправления ошибок:**

* Матчмейкеры теперь корректно проверяют тикеты с несколькими профилями, включая разные правила.

**✨ Улучшения и новые функции:**

* Еще больше оптимизаций для максимизации заполнения матчей с помощью [правила player\_count](#matchmaking-rules). Тикеты теперь будут ждать до конца расширения (или истечения срока действия), если возможен только частичный матч (>min и \<max размер команды).
  * Полные матчи (достигнут максимальный размер команды) создаются немедленно (без изменений).
* Обновитесь до Enterprise [#hosting-cluster](#hosting-cluster "mention") чтобы разблокировать матчмейкинг [#analytics](#analytics "mention")! Получайте сведения о нагрузке и производительности матчмейкера без необходимости писать код или выполнять настройку. Метрики при запуске включают:
  * общее количество тикетов, backfills, назначений и развертываний за пользовательский период времени,
  * поминутные значения вышеуказанных метрик за пользовательский период времени,
  * итоги и временные ряды по просроченным тикетам, расширенным матчам, скорости заполнения матчей,
  * метрики использования API и многое другое.
* Улучшена [#matchmaking-rules](#matchmaking-rules "mention") документация с лучшими примерами и визуализациями.

#### 3.0.0 (20 мая 2025)

**⚠️ Ломающие изменения:**

* Используйте [мин./макс. размер команды для эффективного заполнения команд](#matchmaking-rules) (заменяет расширения по количеству игроков):
  * в вашей конфигурации `player_count` правило, замените `team_size` на `min_team_size` и `max_team_size` чтобы добиться матчмейкинга с «максимальными усилиями», стремящегося максимизировать скорость заполнения матчей,
  * чтобы требовать определенное количество игроков в команде, установите одинаковые значения min и max,
  * обратные заполнения обходят `player_count` правило и всегда сопоставляются с 1 тикетом (без изменений).
* Тикеты, групповые тикеты и backfills, у которых все задержки выше максимального `max_latency` в заданном профиле, будут немедленно отклонены с ответом `400 Bad Request` на запрос создания тикета вместо истечения срока действия:
  * применяется только если [правило latency](#matchmaking-rules) настроено,
  * чтобы обойти это поведение, создайте расширение с `max_latency: 99999` (любое значение выше таймаута измерения задержки вашего клиента).
* [Внедренные переменные среды](#injected-environment-variables) содержащие данные тикета, теперь включают поле `id` (ID тикета), чтобы их было легче повторно использовать при создании [#backfills](#backfills "mention").

🩹 **Исправления ошибок:**

* [#backfill](#backfill "mention") теперь использует настроенный период удаления и истечения (как тикеты и групповые тикеты).
* [#backfill](#backfill "mention") теперь корректно сопоставляет, используя настроенные [`intersection` правила](#matchmaking-rules).
* Исправлено [спецификация openAPI](#matchmaking-api) для POST [#backfills](#backfills "mention") запроса (требуется `public_ip`) и ответа GET /tickets (`team_id` необязательно), включая примеры.

**✨ Улучшения и новые функции:**

* Теперь рассматривается до 3 раз больше потенциальных совпадений, что приводит к более оптимальным группам и максимизирует скорость заполнения матчей.
* До 200% более высокая скорость матчмейкинга благодаря оптимизации параллелизма.
* До 40% более высокая скорость заполнения матчей благодаря оптимизации алгоритма расширений.
* Улучшена стабильность сервиса и увеличена скорость быстрого перезапуска.

{% hint style="info" %}
Бенчмарки были получены на хаотически сгенерированных данных с использованием [конфигурации Advanced Example](#configuration).
{% endhint %}

<details>

<summary>Архив журнала изменений (v2.1.0 и ниже)</summary>

#### 2.1.0 (24 февр. 2025)

**⚠️ Ломающие изменения:**

* Разделена информация о профиле игры и стадии расширения в [#injected-environment-variables](#injected-environment-variables "mention"):
  * `MM_MATCH_PROFILE` теперь будет содержать только имя профиля, как оно указано в конфигурации.
  * Добавлено `MM_EXPANSION_STAGE` который будет содержать стадию расширения в виде строки (например, "initial", "15", "30").
* Назначения тикетов теперь включают ID группы, когда [#endpoint-tickets](#endpoint-tickets "mention"). ID группы также включен как [#injected-environment-variables](#injected-environment-variables "mention")в виде отображения ID группы на список ID игроков группы.
* Назначения тикетов теперь включают ID команды, когда [#endpoint-tickets](#endpoint-tickets "mention"). ID команды также включен в каждый объект данных тикета [#injected-environment-variables](#injected-environment-variables "mention").
* [#endpoint-tickets](#endpoint-tickets "mention") теперь возвращает `409 Conflict` HTTP-код вместо `204 No Content` чтобы указать, что тикет не может быть удален, поскольку развертывание начинается. Чтобы заменить вышедших игроков, используйте [#backfill](#backfill "mention") выданный сервером после заранее указанного периода ожидания.
* [#endpoint-backfills](#endpoint-backfills "mention") параметр тела запроса `attributes.deployment_request_id` был перемещен в `attributes.assignment.request_id`.
* [#endpoint-backfills](#endpoint-backfills "mention") тело запроса теперь требует полных сведений о назначении в составе `attributes` параметра в дополнение к `request_id`.

🩹 **Исправления ошибок:**

* Разрешенные значения правила пересечения теперь [#injected-environment-variables](#injected-environment-variables "mention") в переменной среды `MM_INTERSECTION` .
* Функция быстрого перезапуска теперь надежно заново генерирует конечные точки API и спецификацию openAPI при изменении конфигурации.
* Исправлено несколько ошибок во время запуска/перезапуска матчмейкера, приводивших к длительному времени запуска или зависанию матчмейкера.

**✨ Улучшения и новые функции:**

* Повышены ограничения скорости и масштабируемость всех конечных точек API во всех тарифах матчмейкера.
* При назначении игрока на [#backfill](#backfill "mention"), ID нового тикета игрока будет добавлен как тег к [deployments](https://docs.edgegap.com/ru/learn/orkestraciya/deployments "mention").
* Добавлена функция аутентификации Swagger UI для тестирования API напрямую в веб-интерфейсе без необходимости использовать Postman.
* Улучшены примеры openAPI, чтобы они точнее отражали реалистичные запросы и ответы.
* Добавлена новая [#inspect-api](#inspect-api "mention") предназначенная для целей разработки и отладки.
  * Позволяет выводить список всех текущих тикетов игроков в виде пагинированного списка.
  * Позволяет выводить список всех текущих матчей в виде пагинированного списка.

#### 1.0.0 (9 дек. 2024)

* [#backfill](#backfill "mention"): По (популярному) запросу мы добавляем backfill с автоматическим назначением тикетов, что позволяет повторно использовать серверные места, когда игроки покидают сессию.
  * Идеально подходит для заполнения пустых мест игроков после начала матча или для замены игроков, покинувших матч.
* [#join-as-group](#join-as-group "mention"): Мы добавляем возможность присоединяться группой к уже доступной возможности заполнять несколько команд игроками.
  * Идеально подходит для совместного входа в очередь матчмейкинга с группой друзей или из общего лобби.
* [#matchmaking-sdk](https://docs.edgegap.com/ru/unity/developer-tools#matchmaking-sdk "mention") и [#edgegap-integration-kit-by-betide-studio](https://docs.edgegap.com/ru/unreal-engine/developer-tools#edgegap-integration-kit-by-betide-studio "mention") SDK для матчмейкинга:
  * Чтобы упростить интеграцию, мы теперь предлагаем Software Development Kits для самых популярных игровых движков.
* Исправлена ошибка, из-за которой [#latencies-attributes](#latencies-attributes "mention") не применялось корректно.
* Тикеты теперь будут автоматически отменяться после [#matchmaking-process](#matchmaking-process "mention") если они не были назначены на развертывание.
* Теперь вы можете [#endpoint-tickets](#endpoint-tickets "mention") чтобы улучшить поток вашего процесса матчмейкинга.
* Развертывания, создаваемые матчмейкером, теперь помечаются ID тикетов.
* Теперь вы можете редактировать конфигурацию во время работы матчмейкера. Это запускает быстрое перезагружение вашей конфигурации без необходимости полного цикла выключения/включения матчмейкера. Примечание: эта функция не рекомендуется для production-сред, поскольку она удаляет все текущие тикеты и временно делает API недоступным.
* Исправлено [#injected-environment-variables](#injected-environment-variables "mention") чтобы использовать правильные примитивные типы вместо массивов.
* Исправлено [#injected-environment-variables](#injected-environment-variables "mention") значения JSON, которые ранее содержали экранированные символы.

#### 0.2.3 (8 окт. 2024)

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

#### 0.2.2 (3 окт. 2024)

* Исправлена проблема с проверкой TLS/SSL-сертификата, из-за которой матчмейкер не запускался.

#### 0.2.1 (30 сент. 2024)

* Исправлена ошибка, из-за которой конечная точка beacons возвращала ошибку 500.

#### 0.2.0 (25 сент. 2024)

* Базовая аутентификация теперь обязательна для всех конечных точек.
* Добавлена возможность настраивать количество повторных попыток при сбое назначения на сервер.
* Командный матчмейкинг теперь является вариантом по умолчанию для всех конфигураций матчмейкинга.
* И application, и version теперь являются обязательными полями во всех профилях.
* Представлена новая конечная точка для мониторинга состояния матчмейкера.
* Обновлен формат переменной среды tickets в развертывании.
* Добавлена опция конфигурации, позволяющая хостам взаимодействовать с матчмейкером.
* Debug API теперь доступен только при явном включении в конфигурации (в настоящее время он отключен для переработки).
* The `game_profile` ключ в ответе GET ticket был заменен на `profile`.

</details>

[^1]: игровые клиенты присоединяются к лобби, чтобы получить ID группы подбора и присоединиться к группе

[^2]: максимальное число одновременных пользователей в данный день

[^3]: одновременные пользователи в периоды спада

[^4]: [Функции как сервис](https://www.ibm.com/think/topics/faas)

[^5]: см. другие примеры
