> 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/docs.edgegap.com-fr/learn/appariement/matchmaker-in-depth.md).

# Analyse approfondie

Découvrez en détail les concepts de matchmaking sans code d’Edgegap et personnalisez-les selon vos besoins.

{% hint style="info" %}
Si vous avez besoin d’aide, [veuillez nous contacter sur Discord](https://discord.gg/MmJf8fWjnt). Pour l’assistance aux jeux en direct, consultez notre [système de tickets](https://edgegap.atlassian.net/servicedesk/customer/portal/3).
{% endhint %}

## ✔️ Introduction

Le matchmaking dans les jeux basés sur des matchs vise généralement à :

* **trouver d'autres joueurs** en fonction de critères tels que la région, la latence, le niveau, ou les paramètres du jeu ;
* **rechercher des serveurs** pour rejoindre en fonction de la capacité disponible \[ou du ping, de la région, du niveau, de la carte, du mode] ;
* **démarrer un nouveau serveur** si les serveurs existants sont pleins ou ne répondent pas aux critères des joueurs.

L'expérience du joueur passe avant tout, définissant nos objectifs principaux :

* taux de remplissage des matchs élevé et intégration des fonctionnalités sociales (jouer avec des amis en groupe),
* matchs rapides avec qualité de match contrôlée (faible latence, préférences partagées),
* processus de matchmaking fiable et prévisible avec une disponibilité mondiale.

{% hint style="success" %}
Alternativement, laissez les joueurs **choisir un serveur persistant (toujours en ligne)** d'une liste avec [Navigateur de serveurs](/docs.edgegap.com-fr/learn/navigateur-de-serveurs.md).
{% endhint %}

**Commencez en moins de 5 minutes et testez toutes les fonctionnalités gratuitement, sans carte de crédit requise.**

Passez à la version supérieure lorsque vous êtes prêt pour un cluster plus puissant et privé (dédié). Intégration native avec Edgegap [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md) offre la meilleure latence, peu importe où se trouvent vos joueurs.

{% hint style="info" %}
Le niveau gratuit permet 3 heures d’exécution après chaque redémarrage. Votre matchmaker fonctionnera sur une infrastructure partagée avec des ressources limitées, adaptée aux tests. **Après votre mise en production publique, le matchmaker doit fonctionner 24 h/24 et 7 j/7.**
{% endhint %}

Il existe trois concepts essentiels pour chaque Matchmaker :

* [#hosting-cluster](#hosting-cluster "mention") - infrastructure serveur sous-jacente, entièrement gérée et exploitée par Edgegap.
* [#configuration](#configuration "mention") - ensemble de règles et de paramètres qui définissent le fonctionnement du matchmaker.
* 🌐 Instance de service **-** service de matchmaking en direct fonctionnant 24 h/24 et 7 j/7 sur le Cluster, utilisant la Configuration pour associer les joueurs et produire les affectations de déploiement (serveur).

{% hint style="success" %}
[Mettez fréquemment à jour la version de votre matchmaker](#changelog) pour **profiter des nouvelles fonctionnalités et des corrections de bogues.**
{% endhint %}

## ▶️ Démarrer le matchmaking

**Commencez rapidement - ajoutez notre exemple de démarrage SDK à votre jeu**:

* Unreal Engine [Outils de développement](/docs.edgegap.com-fr/unreal-engine/developer-tools.md#integration-kit):
  * [lire la documentation](https://egik.betide.studio/) par Betide Studios,
  * [installer depuis Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (gratuit pour un usage personnel),
  * [importer un blueprint d'exemple simple](https://blueprintue.com/blueprint/m33u1okj/) (matchmaking) et personnaliser selon vos besoins.
* Unity [Outils de développement](/docs.edgegap.com-fr/unity/developer-tools.md#software-development-kit):
  * [installer le package gratuitement via Unity Package Manager](https://github.com/edgegap/edgegap-unity-sdk),
  * [explorez notre guide de démarrage et des exemples complets](/docs.edgegap.com-fr/unity/appariement.md).

Découvrez le processus de matchmaking pour personnaliser, dépanner et optimiser l’intégration de votre jeu :

<figure><img src="/files/afb83dff8e2b537cadf95c995fb02354a9ccfbec" alt=""><figcaption><p>Séquence de matchmaking</p></figcaption></figure>

1. [Authentifier le joueur](#authenticate) - empêche les copies piratées de jouer en ligne,
2. [Créer le lobby](#create-group) - rejoignez vos amis et partagez les préférences joueur/match,
3. [**Former un groupe**](#group-up) **- enregistrez votre lobby comme groupe de matchmaking,**
4. [**Trouver une partie**](#find-match) **- préparez-vous et commencez à chercher une partie (nouvelle ou existante),**
   1. Attribuer le serveur et injecter les tickets - le serveur est automatiquement attribué après quelques secondes,
5. [**Se connecter et s’authentifier**](#connect-to-server) **- tenter une connexion sécurisée au serveur de jeu,**
   1. Confirmer l’identité - le serveur vérifie l’identité du client de jeu à l’aide de jetons tiers,
   2. Accepter le joueur ou le rejeter - le serveur décide si le joueur est autorisé à rejoindre.

### Authentifier

Toutes les requêtes doivent envoyer un `Autorisation`  entête HTTP avec votre secret **Jeton d'authentification :**

<pre><code>Autorisation : <a data-footnote-ref href="#user-content-fn-1">xxxxxxxx-e458-4592-b607-c2c28afd8b62</a>
</code></pre>

{% hint style="warning" %}
**Gardez vos jetons secrets et en sécurité ! Le personnel d'Edgegap ne vous demandera jamais vos jetons.**
{% endhint %}

{% hint style="success" %}
**Ce jeton peut être inclus sans risque dans votre client de jeu, car il n’accorde pas d’accès à l’API Edgegap.**
{% endhint %}

Les joueurs individuels peuvent être identifiés à l’aide de leur ID de ticket, disponible côté client et serveur. En option, ajoutez une authentification personnalisée ou des limites avec un proxy personnalisé en utilisant [#server-to-server-api](#server-to-server-api "mention") l’API.

### Former un groupe

Créer un groupe (party) garantit que les joueurs rejoignent la même équipe et le même serveur que leurs amis.

{% hint style="success" %}
Créer un groupe marqué comme prêt pour [#find-match](#find-match "mention") rapidement comme un **joueur solo sans membres de groupe**.
{% endhint %}

<figure><img src="/files/663f995c9cb62350eb464c595bf9695972bcf4bb" alt=""><figcaption><p>Diagramme d’activité du cycle de vie du groupe</p></figcaption></figure>

#### Lobby et groupe

Utilisez un service de lobby si la conception de votre jeu exige de définir des préférences de matchmaking contrôlées par le joueur (par ex. choix du personnage, difficulté, carte, etc.). À mesure que les joueurs rejoignent et quittent le lobby, ils mettent également à jour le groupe de matchmaking afin de se préparer à trouver une partie plus tard.

{% hint style="success" %}
**Vous n’avez pas le temps pour un service de lobby ?** Invitez les joueurs à partager les IDs de groupe via Discord ou par message privé.
{% endhint %}

<table><thead><tr><th width="390">Conception du jeu - Fonctionnalité / Exigence</th><th>Lobby avant partie</th><th>Groupe du matchmaker</th></tr></thead><tbody><tr><td><a data-footnote-ref href="#user-content-fn-2">inviter des amis à jouer avec moi</a></td><td>✅</td><td>✅</td></tr><tr><td>modifier mes préférences joueur/match</td><td>✅</td><td>❌</td></tr><tr><td>voir les préférences des autres membres du lobby</td><td>✅</td><td>❌</td></tr><tr><td>stocker et gérer des données clé-valeur personnalisées</td><td>✅</td><td>❌</td></tr><tr><td>notifier les membres du groupe que je suis prêt à jouer</td><td>❌</td><td>✅</td></tr><tr><td>afficher la progression du matchmaking et trouver une partie</td><td>❌</td><td>✅</td></tr><tr><td>obtenir l’attribution d’équipe pour un joueur/groupe</td><td>❌</td><td>✅</td></tr><tr><td>récupérer les détails de connexion au serveur de jeu</td><td>❌</td><td>✅</td></tr></tbody></table>

Notre matchmaker multiplateforme prend en charge tous les services de lobby commerciaux et personnalisés :

<table><thead><tr><th>Service de lobby (tiers)</th><th width="120" data-type="checkbox">Unreal Engine</th><th width="75" data-type="checkbox">Unity</th><th width="50" data-type="checkbox">PC</th><th width="90" data-type="checkbox">Consoles</th><th width="65" data-type="checkbox">VR/XR</th><th width="100" data-type="checkbox">Mobile</th></tr></thead><tbody><tr><td><a href="https://dev.epicgames.com/docs/game-services/lobbies-and-sessions/lobbies/lobbies-intro">Lobby 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">Lobby 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/">Groupe 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">Lobby 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">Lobby 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">Amis 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>Lobby personnalisé<br>(votre entreprise)</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr></tbody></table>

Le propriétaire du lobby (le joueur qui envoie les invitations) doit également créer le groupe de matchmaking.

**Stockez l’ID de votre groupe dans les données partagées du lobby**, afin que les autres membres du lobby puissent facilement trouver et rejoindre un groupe de matchmaking associé au lobby tiers. Les joueurs invités au groupe utilisent l’ID du groupe pour **créer leurs appartenances (rejoindre)**, et pour **stocker de manière sécurisée leurs** [**attributs de matchmaking**](#matchmaking-rules)**.**

{% hint style="warning" %}
**Une fois qu’un groupe commence le matchmaking, il ne peut plus être rejoint.** [#abandon-queue](#abandon-queue "mention") et en créer un nouveau.
{% endhint %}

#### Optimisation du ping

Si [#configuration](#configuration "mention") inclut [`les latences` règle](#rule-example-elo_rating) tous les membres du groupe envoient leurs [Balises de ping](/docs.edgegap.com-fr/learn/orchestration/ping-beacons.md) mesures à **empêcher l’association de joueurs de régions éloignées** ou avec un ping (latence) beaucoup plus élevé/plus faible.

{% code title="Exemple de mesures de ping du client de jeu en millisecondes" %}

```json
{
  "Chicago": 224,4,
  "Francfort": 23,2,
  "Tokyo": 167,4
}
```

{% endcode %}

#### **Quitter la file**

Le propriétaire du groupe peut supprimer le groupe, ce qui supprime automatiquement toutes les appartenances du groupe. Supprimer le groupe après le début du matchmaking annulera toutes les appartenances et les supprimera peu après.

Les membres du groupe (à l’exception du propriétaire) peuvent supprimer leurs appartenances (quitter le groupe) à tout moment avant [#find-match](#find-match "mention"). Supprimer une appartenance après cela annulera le matchmaking pour l’ensemble du groupe.

{% hint style="info" %}
Une fois le matchmaking annulé, les membres sont [retirés automatiquement du matchmaking](#matchmaking-profiles) et notifiés via l’appartenance `status:CANCELLED`  dans leur prochaine réponse de sondage de statut.
{% endhint %}

Une fois annulé, si le groupe souhaite relancer le matchmaking, le propriétaire du groupe doit recréer le groupe, partager le nouvel ID de groupe avec les membres, et leur faire recréer leurs appartenances.

**Une fois qu’une partie est trouvée, le groupe ne peut pas être supprimé** (`409 Conflit`), et sera [supprimé automatiquement](#connect-to-server). Votre serveur doit laisser un certain temps (par ex. 60 s) aux joueurs pour se connecter avant de considérer qu’un joueur a quitté.

Si votre serveur signale qu’un joueur a quitté, vous pouvez :

* remplacer le joueur parti par un personnage IA pour démarrer immédiatement la partie,
* ou créer un [backfill](#backfill-match) pour trouver un nouveau joueur afin de remplacer celui qui est parti,
* ou continuer sans remplacer le joueur parti, si la conception de votre jeu permet un nombre variable de joueurs.

### Trouver une partie

Pour commencer à chercher une partie, tous les membres et le propriétaire doivent se marquer prêts.

{% hint style="success" %}
Pour permettre au propriétaire du groupe **de démarrer le matchmaking immédiatement, marquez les appartenances comme prêtes à la création**. Une fois que le propriétaire se marque prêt, le matchmaking démarre, puisque tout le monde est prêt.
{% endhint %}

{% hint style="info" %}
Pour une meilleure expérience, **fournissez aux joueurs des mises à jour de statut via l’interface en jeu**.
{% endhint %}

**Tous les joueurs doivent interroger leur appartenance à intervalles réguliers** (3 à 5 s recommandé) pour détecter le démarrage du matchmaking, et pour communiquer la progression du matchmaking via l’interface en jeu.

Les joueurs devraient **enregistrer de façon persistante leur appartenance et les IDs de groupe**, ce qui leur permet de redémarrer le jeu et de reprendre sans perdre la progression du matchmaking en cas de crash du client de jeu.

Une fois que nous avons trouvé suffisamment de joueurs pour constituer la même équipe en respectant votre [#matchmaking-rules](#matchmaking-rules "mention"), les joueurs seront notifiés dans la réponse de leur appartenance avec `status:TEAM_FOUND`.

Supprimer une appartenance à ce stade entraînera l’annulation de toutes les appartenances du groupe et le retour de toutes les autres appartenances attribuées à la même équipe vers `status:SEARCHING` .

Les équipes continuent le matchmaking avec d’autres équipes en utilisant les valeurs communes à leurs groupes (ou la moyenne dans le cas de `number_difference` ) jusqu’à ce que suffisamment d’équipes soient rassemblées. Les appartenances l’indiquent avec la réponse  `status:MATCH_FOUND` , ce qui signifie que votre [déploiement est en cours de démarrage](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-start-a-deployment).

**Le matchmaker vise à maximiser le taux de remplissage des matchs, et ne passera pas à `MATCH_FOUND` tant que :**

1. suffisamment d’équipes sont appariées avec la taille maximale d’équipe configurée,
2. ou si [#rule-expansion](#rule-expansion "mention") défini ET que le temps d’expansion est atteint, ET que suffisamment d’équipes sont appariées avec la taille minimale d’équipe configurée,
3. ou que le délai d’expiration du ticket configuré est écoulé ET que suffisamment d’équipes sont appariées avec la taille minimale d’équipe configurée.

Si aucun de ces scénarios ne réussit avant l’expiration configurée du ticket, le groupe et les tickets sont annulés.

{% hint style="info" %}
Vous constatez de longs temps de file d’attente pendant les tests, ou avec des joueurs dans des régions moins populaires ? Définissez une période d’expiration de ticket plus courte (par ex. 30 s) et recréez le groupe (ou les tickets) côté client à l’expiration.
{% endhint %}

L’expiration du ticket se réinitialise automatiquement chaque fois qu’un groupe (ou un joueur) est associé à une équipe.

{% hint style="success" %}
Stocker `team_id`  et `match_id` dans le backend de votre jeu pour afficher en jeu les informations des membres de l’équipe.
{% endhint %}

{% hint style="info" %}
Chaque joueur reçoit un **Ticket ID unique, qui peut être utilisé pour** [#authenticate](#authenticate "mention") **avec les serveurs de jeu.**
{% endhint %}

Si le joueur a été apparié et attribué à un serveur de jeu, son ticket est supprimé automatiquement. Les joueurs qui quittent la file après `status:HOST_ASSIGNED`  peuvent être remplacés par [backfill](#backfill-match).

Une fois que les joueurs reçoivent `status:HOST_ASSIGNED`  ils passent à [#connect-to-server](#connect-to-server "mention").

### Se connecter au serveur

Quelques secondes après avoir trouvé une correspondance, les adhésions passent à `status:HOST_ASSIGNED`  indiquant que votre [le déploiement est maintenant prêt et votre serveur de jeu est en cours d'initialisation](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-3.-deployment-ready).

Chaque joueur lit son `ticket_id`  et  `attribution`  et tente une connexion en utilisant le [**FQDN**](#user-content-fn-3)[^3] **(URL du déploiement)** et le **port externe**. Votre serveur de jeu est peut-être encore en cours d'initialisation à ce moment-là, donc **les joueurs doivent réessayer la connexion plusieurs fois**, jusqu’à dépasser votre temps d'initialisation habituel du serveur :

{% tabs %}
{% tab title="Unreal Engine" %}
Pour **se connecter depuis PIE (éditeur)** pendant le développement et les tests, appuyez sur la touche tilde `~`  et tapez `open {URL}:{port}`  et attendez que votre éditeur charge la carte.

Pour **se connecter depuis une compilation du client de jeu** (et dans un environnement de production réel) essayez

* Unreal Engine [⚡ Kit d'intégration](https://docs.edgegap.com/learn/unreal-engine-games/developer-tools#integration-kit):
  * [installer depuis le Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (gratuit pour un usage personnel),
  * [importer un blueprint d'exemple simple](https://blueprintue.com/blueprint/m33u1okj/) et l'adapter à vos besoins.

{% hint style="success" %}
En cas d'échec de connexion ou d'écran noir, consultez notre [guide de dépannage](/docs.edgegap.com-fr/unreal-engine.md#troubleshooting-and-faq).
{% endhint %}
{% endtab %}

{% tab title="Unity" %}
Pour **connecter votre éditeur Unity** ou **client de jeu** à votre déploiement cloud, saisissez :

* **Déploiement** **URL** pointant vers l'adresse IP du serveur, généralement dans `NetworkManager` composant.
* **Port externe** correspondant au [port d'écoute interne du serveur](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#port-mapping), généralement dans un composant Transport.

{% hint style="success" %}
En cas de délai d'attente de connexion ou d'autres problèmes, consultez notre [guide de dépannage](/docs.edgegap.com-fr/unity.md#troubleshooting-and-faq-4).
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Nous ne demandons pas aux joueurs de confirmer la partie, car nous visons à fournir le temps d'accès au gameplay le plus court possible, un taux de remplissage des parties élevé, et à minimiser l'évitement de file d'attente et les annulations de partie.
{% endhint %}

Les clients de jeu doivent **enregistrer de façon persistante leur identifiant d’attribution entre les redémarrages du jeu**, afin qu’en cas de plantage du client de jeu, ils puissent récupérer les détails de connexion et tenter de se reconnecter.

### Match de backfill

Optionnellement, certains jeux peuvent avoir des besoins particuliers en matière de matchmaking, tels que :

* permettre à de nouveaux joueurs de rejoindre des parties en cours (amis ou « aléatoires »),
* remplacer les joueurs qui quittent (abandonneurs) après le démarrage du serveur afin d’éviter de relancer la partie,
* permettre aux spectateurs de rejoindre et d’observer les matchs de tournoi ou d’amis (e-sport),
* centraliser les joueurs sur des serveurs plus grands afin d’offrir davantage d’interactions sociales (MMO).

Le backfill est un **ticket détenu par le serveur représentant les joueurs actuellement connectés au serveur.** Cela garantit que les joueurs ajoutés ultérieurement respecteront vos règles de matchmaking lorsqu’ils seront mis en correspondance avec les joueurs actuels.

{% hint style="warning" %}
[Analyse approfondie](/docs.edgegap.com-fr/learn/appariement/matchmaker-in-depth.md#backfill-match) pour remplacer les sessions Seat/Match. Le matchmaker ne prend en charge que la session par défaut.
{% endhint %}

<figure><img src="/files/4406a6044e67c48203139d926e36e2406f74b463" alt=""><figcaption><p>Scénarios de backfill visualisés</p></figcaption></figure>

{% hint style="success" %}
**Les backfills ignorent** `player_count`  **la règle, et ne font toujours correspondre qu’un seul groupe**. `backfill_group_size`  contrôle la capacité des équipes avec une stratégie en round-robin, en remplissant les équipes de manière équilibrée et contrôlée.
{% endhint %}

**Les étapes pour réaliser un backfill réussi sont :**

1. Le serveur crée un Backfill pour chaque équipe à laquelle il manque des joueurs, en utilisant les valeurs provenant de :
   * Réel `affectation`  données récupérées depuis [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#injected-environment-variables) (déploiement).
   * des joueurs actuellement connectés `tickets`:
     * depuis [Analyse approfondie](/docs.edgegap.com-fr/learn/appariement/matchmaker-in-depth.md#injected-variables) (matchmaker), des backfills précédents `assigned_ticket` réponse, ou des données fictives manipulées pour correspondre à des joueurs spécifiques,
     * remplacer `backfill_group_size`  les valeurs par les tailles de groupe possibles [jusqu’à la capacité disponible](#user-content-fn-4)[^4],
2. Les clients de jeu créent de nouveaux tickets (adhésions) et incluent `backfill_group_size`  valeurs :
   * `"1"`  si le joueur effectue le matchmaking seul.
   * [`"2"`  si le joueur fait partie d’un groupe de matchmaking de 2x membres au total](#user-content-fn-5)[^5].
   * `"nouveau"`  si les joueurs ont activé le lancement de nouvelles parties en plus de la possibilité de rejoindre des parties en cours.
3. Les clients de jeu passent ensuite à [Analyse approfondie](/docs.edgegap.com-fr/learn/appariement/matchmaker-in-depth.md#find-match) et associent les joueurs au backfill correspondant.
4. Si le groupe complété par backfill n’a pas entièrement rempli l’équipe, le serveur peut répéter ce processus avec les tickets des joueurs nouvellement ajoutés via backfill, afin d’ajouter davantage de joueurs et d’atteindre les tailles d’équipe souhaitées.

{% hint style="success" %}
Les backfills ignorent les règles de taille d’équipe et associent toujours 1 backfill à 1 groupe. **Pour n’effectuer des correspondances qu’avec des backfills et désactiver la mise en correspondance avec d’autres joueurs dans la file d’attente, définissez `min_team_size: 999999` .**
{% endhint %}

<details>

<summary>🥛 Exemple de backfill (présentation du backfill)</summary>

```json
{
  "profile": "backfill-example",
  "attributes": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "Montreal",
        "country": "Canada",
        "continent": "Amérique du Nord",
        "administrative_division": "Quebec",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "attributes": {
        "beacons": {
          "New York": 12.2,
          "Los Angeles": 45.3,
          "Paris": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "attributes": {
        "beacons": {
          "New York": 21.0,
          "Los Angeles": 30.2,
          "Paris": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": null
}
```

</details>

<details>

<summary>🥛 Exemple d’affectation de backfill (présentation du backfill)</summary>

```json
{
  "profile": "backfill-example",
  "attributes": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "Montreal",
        "country": "Canada",
        "continent": "Amérique du Nord",
        "administrative_division": "Quebec",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "attributes": {
        "beacons": {
          "New York": 12.2,
          "Los Angeles": 45.3,
          "Paris": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "attributes": {
        "beacons": {
          "New York": 21.0,
          "Los Angeles": 30.2,
          "Paris": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": {
    "profile": "backfill-example",
    "player_ip": "244.13.201.244",
    "attributes": {
      "beacons": {
        "New York": 30.2,
        "Los Angeles": 10.5,
        "Paris": 123.9
      },
      "backfill_group_size": [
        "new",
        "1"
      ]
    },
    "id": "cqg0bg550h7uujd77khg",
    "group_id": "e0cf41c0-f88f-456e-a032-03b1d6821a9a",
    "created_at": "2024-08-20T13:38:08.251393+00:00",
    "status": "HOST_ASSIGNED"
  }
}
```

</details>

{% hint style="info" %}
Voir [Gestion des sièges Mirror](https://docs.edgegap.com/docs/sample-projects/mirror-on-edgegap#bonus-seat-sessions-management) et [Gestion des sièges FishNet](https://docs.edgegap.com/docs/sample-projects/fishnet-on-edgegap#bonus-seat-sessions-management) pour **surveillance de la connexion des joueurs**.
{% endhint %}

Une fois l’initialisation du serveur de jeu terminée, **votre serveur devrait**:

* **Démarrer le minuteur d’abandon pour chaque nouveau joueur.** Nous recommandons d’indiquer la progression du chargement aux joueurs connectés avec une scène/un niveau de chargement - soit une scène 3D complète, une interface sociale de type lobby, ou un écran de chargement avec une barre de progression.
* **Suivre au fil du temps les nouvelles connexions de joueurs ou les départs de joueurs existants**:
  1. Les nouveaux joueurs doivent annoncer l’ID du ticket au serveur pour l’authentification et pour faire correspondre leur connexion au matchmaker [#injected-variables](#injected-variables "mention") ou `assigned_ticket` (si backfill).
  2. Créez de nouveaux backfills pour la capacité de joueurs inutilisée (joueurs partis) tout au long de la durée de vie du serveur.
  3. Renouvelez les backfills expirés, qui sont supprimés après `ticket_expiration_period`.
* **Nettoyez (supprimez) tous les backfills restants** une fois que le [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-5.-deployment-stopped "mention"):
  * Unity - [`OnApplicationQuit`](https://docs.unity3d.com/6000.0/Documentation/ScriptReference/MonoBehaviour.OnApplicationQuit.html) callback ou callback personnalisé de fin de partie,
  * 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) , ou un callback personnalisé de fin de partie.

{% hint style="info" %}
Utilisez [GetEnvironmentVariable en C#](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) ou [GetEnvironmentVariable en C++](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable) pour obtenir les valeurs des variables.
{% endhint %}

N’importe quel profil peut être utilisé pour le Backfill tant qu’une attribution serveur valide et au moins un ticket sont fournis. Voir [Appariement](/docs.edgegap.com-fr/learn/appariement.md#backfill-showcase) pour un exemple minimal.

## ⚙️ Configuration

L’API du Matchmaker est générée à partir d’une configuration JSON spécifiée lorsque vous créez un nouveau Matchmaker (ou un redémarrage rapide). Vous pouvez spécifier n’importe quel nombre de profils avec des règles et des expansions variées :

{% hint style="success" %}
Voir [Appariement](/docs.edgegap.com-fr/learn/appariement.md) pour nos SDK et des scénarios d’exemple détaillés.
{% endhint %}

<details>

<summary>🍀 Exemple simple (configuration minimale recommandée)</summary>

<pre class="language-json"><code class="lang-json">{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "simple-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "<a data-footnote-ref href="#user-content-fn-6">my-game-server</a>",
        "version": "<a data-footnote-ref href="#user-content-fn-7">2024.01.30-16.23.00-UTC</a>"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 2
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
</code></pre>

</details>

<details>

<summary>🏁 Exemple avancé (configuration d'exemple complète)</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "allowed_cors_origins": [
    "https://*.my-game-server.com"
  ],
  "profiles": {
    "advanced-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 125
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          },
          "selected_game_mode": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "elo_rating": {
              "max_difference": 150
            },
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "60": {
            "elo_rating": {
              "max_difference": 200
            }
          },
          "180": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            },
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    }
  }
}
```

</details>

<details>

<summary><span data-gb-custom-inline data-tag="emoji" data-code="1f95b">🥛</span> Exemple de configuration de backfill</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "backfill-example": {
      "ticket_expiration_period": "30s",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
```

</details>

<details>

<summary>⚔️ Exemple de jeu compétitif</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "casual-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "180": {
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    },
    "competitive-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "versus_ranks": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}
```

</details>

<details>

<summary>🤝 Exemple de jeu coopératif</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "exemple-coopératif": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "difficulté_sélectionnée": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "niveau_du_joueur": {
            "type": "number_difference",
            "attributes": {
              "différence_maximale": 10
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "niveau_du_joueur": {
              "différence_maximale": 20
            }
          },
          "60": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 4
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}
```

</details>

<details>

<summary>🎈 Exemple de jeu social</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "social-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "attributes": {
              "team_count": 1,
              "min_team_size": 50,
              "max_team_size": 50
            },
            "type": "player_count"
          },
          "beacons": {
            "attributes": {
              "difference": 125,
              "max_latency": 150
            },
            "type": "latencies"
          },
          "selected_mode": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "15": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "match_size": {
              "team_count": 1,
              "min_team_size": 20,
              "max_team_size": 50
            }
          },
          "30": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 10,
              "max_team_size": 50
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 50
            }
          }
        }
      }
    }
  }
}
```

</details>

{% hint style="warning" %}
Modifier un matchmaker en cours d’exécution **déclenchera un rechargement rapide**, supprimant tous les tickets et provoquant une courte interruption de service.
{% endhint %}

<details>

<summary><code>La configuration de l'application n'est pas valide pour le profil XYZ.</code></summary>

* Nous n'avons pas trouvé votre [Applications et versions](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md), veuillez vérifier `application`  valeurs.

</details>

<details>

<summary><code>L'image Docker pour '2024.01.30-16.23.00-UTC' n'est pas mise en cache.</code></summary>

[**🌟 Passez au niveau Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **pour débloquer** [**déploiements instantanés avec mise en cache**](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-start-a-deployment)**.**

* Les images non mises en cache de plus de 4 Go peuvent prendre plus de temps à se déployer, entraînant [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error "mention"). Envisagez d'optimiser la taille de votre image serveur ([Unreal Engine](/docs.edgegap.com-fr/unreal-engine.md#optimize-server-build-size) / [Unity](/docs.edgegap.com-fr/unity.md#optimize-server-build-size)).
* Vous pouvez procéder malgré tout, bien que nous recommandions de tester le temps de déploiement.

</details>

### Profils (files d’attente) <a href="#matchmaking-profiles" id="matchmaking-profiles"></a>

Les profils représentent des files de matchmaking entièrement séparées, partageant la même version de matchmaker. Vous pouvez **configurer n’importe quel nombre de profils pour chaque matchmaker.** Répartir votre base de joueurs sur plusieurs profils peut entraîner des temps d’attente plus longs pour vos joueurs.

Chaque profil de matchmaker utilise une [Version de l’application](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md) comme modèle pour démarrer de nouveaux déploiements (serveurs).

{% hint style="success" %}
Certains modes de jeu peuvent nécessiter davantage de vCPU / RAM, surtout s’ils prennent en charge un plus grand nombre de joueurs. Chaque **matchmaker peut inclure plusieurs profils**, chacun lié à une version d’application avec des ressources ajustées.
{% endhint %}

### Règles <a href="#matchmaking-rules" id="matchmaking-rules"></a>

Chaque joueur et groupe rejoint la file de matchmaking et trouve des parties en utilisant  `les règles` initiales

au départ. `.rules.initial` représente une règle, où :

* **key** est une valeur de chaîne pour nommer la règle comme vous le souhaitez ; par ex. `match_size` , et
* **value** est un objet définissant le type et les attributs de la règle, conformément à notre ensemble de règles standard.

{% hint style="info" %}
Toutes les règles doivent être satisfaites simultanément pour lancer l’attribution d’hôte et démarrer ou trouver un déploiement.
{% endhint %}

**Opérateurs (type de règle)**

**`player_count`** est une règle spéciale définissant combien de joueurs doivent correspondre pour lancer l’attribution.

{% hint style="warning" %}
Règle `player_count`  **est requis et ne peut être défini qu’une seule fois** dans vos règles de configuration initiale.
{% endhint %}

Le matchmaker s’efforce toujours de maximiser le taux de remplissage des matchs, jusqu’à `max_team_size` :

1. si la taille maximale de l’équipe est atteinte, le match est créé immédiatement,
2. sinon, les joueurs attendent dans la file pour remplir le match jusqu’à [l’expansion](#rule-expansion) (ou l’expiration) est sur le point d’arriver,
3. peu avant [l’expansion](#rule-expansion) (ou l’expiration), si un match partiel est possible (≥ min et < taille maximale de l’équipe), ce match sera créé avec tous les joueurs au même stade d’expansion (en supposant que les autres règles passent).

{% hint style="success" %}
Pour les modes de jeu coopératifs, free-for-all ou à taille d’équipe asymétrique, définissez `"team_count": 1` .
{% endhint %}

Le nombre d’équipes peut être configuré pour composer plusieurs équipes équilibrées pour les jeux compétitifs :

* **les attributs du groupe sont calculés comme la moyenne/le chevauchement** des **attributs des joueurs,**
* **les attributs de l’équipe sont calculés comme la moyenne/le chevauchement** des **attributs du groupe.**

En supposant une taille d’équipe fixe de 4 joueurs :

<figure><img src="/files/f43554f07b1bdce5af7fc1776f692271ae328c81" alt=""><figcaption><p>Exemples de scénarios de match</p></figcaption></figure>

{% hint style="info" %}
**Les groupes s’apparient en équipes sans sur-remplissage,** uniquement si une équipe a suffisamment de capacité pour accueillir tout le groupe.
{% endhint %}

**`égalité_de_chaîne`** associe les joueurs ayant exactement la même valeur de chaîne.

<details>

<summary>Exemple de règle : <code>selected_game_mode</code></summary>

`selected_game_mode`  la règle associera les joueurs en tenant compte de la casse :

:white\_check\_mark: Alice + Bob + Dave peuvent correspondre,

:x: Alice + Erin, ou Charlie + Frank ne correspondront jamais.

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

</details>

**`number_difference`** associe les joueurs dans la différence numérique absolue entre eux.

<details>

<summary>Exemple de règle : <code>elo_rating</code></summary>

`elo_rating`  règle ci-dessus avec `"max_difference": 50` initialement :

:white\_check\_mark: Alice + Bob peuvent correspondre, ou Bob + Charlie peuvent correspondre,

:x: Alice + Bob + Charlie ne correspondront jamais.

<figure><img src="/files/45490cbc00ba08cf864d44534ed2124a19d62e1f" alt=""><figcaption></figcaption></figure>

</details>

**`latences`** est une règle spéciale optimisant le ping des matchs de joueurs :

* réduire la latence client-serveur en supprimant les régions à forte latence (au-dessus du seuil),
* améliorer l’équité des matchs en regroupant les joueurs ayant une latence similaire (en dessous de la différence).

<details>

<summary>Exemple de règle : <code>balises</code></summary>

`balises` règle configurée avec `"difference": 100, "max_latency": 200`  correspondra à :

:white\_check\_mark: Alice et Bob peuvent correspondre :

* Tokyo est écarté (>200 ms),
* la latence pour Chicago se situe dans une différence absolue de 100 ms.

<table><thead><tr><th width="180">Ville de la balise</th><th width="80">Correspondance</th><th width="132">abs(A - B) [ms]</th><th width="164">Alice [ms]</th><th width="164">Bob [ms]</th></tr></thead><tbody><tr><td>Chicago</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>75.0</td><td>12.3</td><td>87.3</td></tr><tr><td>Los Angeles</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-8">113.2</a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>145.6</td><td>32.4</td></tr><tr><td><del>Tokyo</del></td><td>n/a</td><td>n/a</td><td><a data-footnote-ref href="#user-content-fn-9"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-9"><del>253.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr></tbody></table>

:x: Alice et Charlie ne correspondront jamais :

* aucune balise n'a une latence < 200 ms pour les deux joueurs,
* Alice vit en Amérique du Nord - Illinois,
* Charlie vit en Asie - Japon.

<table><thead><tr><th width="180">Ville de la balise</th><th width="80">Correspondance</th><th width="132">abs(A - B) [ms]</th><th width="164">Alice [ms]</th><th width="164">Charlie [ms]</th></tr></thead><tbody><tr><td><del>Chicago</del></td><td>n/a</td><td>n/a</td><td>12.3</td><td><a data-footnote-ref href="#user-content-fn-9"><del>215.6</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>Los Angeles</del></td><td>n/a</td><td>n/a</td><td>145.6</td><td><a data-footnote-ref href="#user-content-fn-9"><del>238.3</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>Tokyo</del></td><td>n/a</td><td>n/a</td><td><a data-footnote-ref href="#user-content-fn-9"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>24.2</td></tr></tbody></table>

</details>

{% hint style="warning" %}
Règle `latences`  est **facultative et ne peut être définie qu’une seule fois dans votre configuration initiale** règles.
{% endhint %}

Certains joueurs ayant un ping élevé vers tous les balises en raison de [Fournisseur d'accès](#user-content-fn-10)[^10] des problèmes ou d'une connexion lente (par ex. sans fil/mobile) peuvent provoquer des lags et dégrader l'expérience de jeu des autres. Pour atténuer ce problème :

* Élargir progressivement la latence maximale et l'écart autorisés (voir [Exemple de configuration avancée](/docs.edgegap.com-fr/learn/appariement.md#advanced-example)),
  * les joueurs avec un ping élevé peuvent devoir attendre plus longtemps que d'habitude pour trouver une partie.
* Alternativement, permettre aux joueurs de remplacer la mesure par une sélection manuelle de région, n'envoyant des valeurs de ping factices que pour les régions sélectionnées par le joueur uniquement (par ex. 25 ms pour une correspondance rapide),
  * cela peut avoir un impact négatif sur l'expérience des coéquipiers et des adversaires du joueur.

{% hint style="info" %}
**Un ping élevé vers les balises n'entraîne pas toujours un ping élevé vers le serveur**. Les déploiements sont disponibles dans plus d'emplacements que les balises. Les balises sont orchestrées en temps réel pour privilégier la couverture mondiale et la fiabilité.
{% endhint %}

{% hint style="success" %}
Voir [Appariement](/docs.edgegap.com-fr/learn/appariement.md) pour **mesure de ping automatisée utilisant nos SDK**.
{% endhint %}

{% hint style="danger" %}
Les balises sont automatiquement redimensionnées en temps réel - ajout, suppression ou remplacement des balises existantes. Vos clients et votre backend doivent en tenir compte et **recharger la liste des balises avant chaque manche de matchmaking**.
{% endhint %}

**`intersection`** associe les joueurs ayant une ou plusieurs valeurs de chaîne qui se chevauchent, en respectant la casse.

<details>

<summary>Exemple de règle : <code>selected_map</code></summary>

`selected_map` règle ci-dessus avec `"overlap": 1`  correspondra :

:white\_check\_mark: Alice + Bob + Charlie peuvent correspondre, ou Alice + Bob + Dave peuvent correspondre,

:x: Alice + Bob + Charlie + Dave ne correspondront jamais.

<figure><img src="/files/1d2ba7cf5bad262f01aff7346d110fb5582cd4d4" alt=""><figcaption></figcaption></figure>

</details>

#### Expansion des règles

Optionnellement, **`les expansions`**  modifient les attributs d’une règle après un certain temps passé dans la file pour assouplir les limitations et élargir le pool de joueurs pouvant être appariés, **ce qui permet des matches plus rapides**.

<details>

<summary>Scénario d’exemple : expansions</summary>

[Initialement, nous exigeons 1 équipe composée exactement de 4 joueurs (éventuellement répartis en groupes)](/docs.edgegap.com-fr/learn/appariement.md#advanced-example) avec :

* latence maximale de 125 ms par rapport au même (n’importe quel) beacon,
* différence de latence de 125 ms ou moins entre la valeur la plus basse et la plus élevée pour le même beacon,
* différence de classement de 50 points ou moins entre le joueur le moins et le plus bien classé,
* exactement le même mode de jeu sélectionné (sensibles à la casse),
* au moins une sélection de carte correspondante (sensible à la casse) parmi les joueurs,
* au moins un [taille du groupe de backfill](#backfill-match) valeur parmi les joueurs.

Dans l’exemple ci-dessus, nous **élargissons la recherche en modifiant les attributs** après :

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>30 secondes :</td><td><ul><li>4 joueurs</li><li><strong>plage de classement de 150 points</strong></li><li><strong>latence max de 250 ms</strong></li></ul></td></tr><tr><td>60 secondes :</td><td><ul><li>4 joueurs</li><li><strong>plage de 200 points de classement</strong></li><li>latence maximale de 250 ms</li></ul></td></tr><tr><td>3 minutes (180 s) :</td><td><ul><li><strong>1 à 4 joueurs</strong></li><li>plage de 200 points de classement</li><li><strong>n’importe quelle latence</strong></li></ul></td></tr></tbody></table>

</details>

{% hint style="info" %}
Les extensions de l’attribut de n’importe quelle règle **écraseront les valeurs précédentes** de cet attribut.
{% endhint %}

{% hint style="success" %}
[**Découvrez les pièges courants du matchmaking**](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs)**, et** [**optimisez votre taux de remplissage des matchs avec notre guide**](https://edgegap.com/blog/how-to-optimize-session-fill-rate-in-your-matchmaker)**.**
{% endhint %}

## 📌 Variables injectées

Votre serveur peut avoir besoin de connaître des détails sur ses joueurs. Les attributs des joueurs, les valeurs de match résolues et d’autres valeurs sont injectés dans votre déploiement, en plus du [Applications et versions](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#injected-variables).

Aperçu non formaté **🏁 Variables d’exemple avancées :**

```
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" %}
Les variables d’environnement sont **stockées sous forme de JSON sérialisés en chaîne**, analysez-les à l’aide de notre SDK ou d’une méthode personnalisée.
{% endhint %}

{% hint style="success" %}
**Les serveurs peuvent associer les connexions des joueurs à des groupes et des attributs** après que le joueur a envoyé son ID de ticket au serveur.
{% endhint %}

## 🧵 Traçage des joueurs

Si vos joueurs rencontrent des problèmes, tracer leur parcours jusqu’aux journaux du serveur peut être utile. Chaque Matchmaker **déploiement** **sera associé aux IDs de ticket des joueurs attribués** afin que vous puissiez facilement [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#filter-deployments) et trouver [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#container-logs) pour vous aider à dépanner.

{% hint style="success" %}
**Afficher les IDs de ticket et de déploiement dans l’interface d’historique des matchs du client** pour tracer les joueurs lors du dépannage.
{% endhint %}

{% hint style="info" %}
Voir [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#connection-quality) pour en savoir plus sur le dépannage des déploiements.
{% endhint %}

## 👀 Analyses

Obtenez des informations sur la charge et les performances de votre matchmaking, sans code ni configuration requis.

🌟 [**Passez Matchmaker au niveau Entreprise**](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list) **pour débloquer les métriques et les informations de matchmaking :**

<figure><img src="/files/2d7cce3aaf617dc45f0dc36ef1d77039fe0178be" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/7a6f01aa536d33d8b8ddc3b8115be3414c2c0a91" alt=""><figcaption></figcaption></figure>

## ☁️ Cluster d’hébergement

Matchmaker est hébergé et géré de manière pratique 24 h/24, 7 j/7 par Edgegap.

Choisissez l’option d’hébergement la mieux adaptée à votre objectif :

* **Cluster gratuit (partagé)** pour tester toutes les fonctionnalités et explorer les synergies avec votre conception,
  * s'éteint automatiquement après 3 heures, nécessitant un redémarrage pour continuer les tests.
* **Cluster privé** **(dé dédié)** pour garantir un environnement stable pour vos besoins de production,
  * choisissez votre région et obtenez un support 24/7 pour les jeux en direct afin de publier en toute confiance.

#### Niveaux de cluster privé

Nous proposons actuellement [3 niveaux de cluster privé](https://edgegap.com/resources/pricing#managed-infrastructure) pour répondre aux besoins de chacun :

<table><thead><tr><th width="160">Niveau</th><th align="right">Niveau Hobbyiste</th><th align="right">Niveau Studio</th><th align="right">Niveau Entreprise</th></tr></thead><tbody><tr><td>Le mieux adapté pour</td><td align="right">les passionnés,<br>les développeurs solo</td><td align="right">les lancements commerciaux</td><td align="right">les lancements à fort trafic</td></tr><tr><td>Ressources</td><td align="right">1 vCPU + 2 Go de RAM</td><td align="right">6 vCPU + 12 Go de RAM</td><td align="right">18 vCPU + 48 Go de RAM</td></tr><tr><td>Redondance</td><td align="right">1 nœud virtuel</td><td align="right">3 nœuds virtuels</td><td align="right">3 nœuds virtuels</td></tr><tr><td>Limite de débit (req/s)</td><td align="right">200</td><td align="right">750</td><td align="right">2,000</td></tr><tr><td>Prix, à l’heure</td><td align="right">$0.0312</td><td align="right"> $0.146</td><td align="right">$0.548</td></tr><tr><td><strong>Prix, sur 30 jours</strong><br>(utilisation sans interruption)</td><td align="right"><strong>$22.464</strong></td><td align="right"><strong>$105.12</strong></td><td align="right"><strong>$394.56</strong></td></tr></tbody></table>

Passez à un cluster privé en un clic. Il est également possible de changer les niveaux de cluster privé après le lancement, sans aucun temps d’arrêt pour les joueurs, avec [#rolling-updates-and-ab-tests](#rolling-updates-and-ab-tests "mention"). Les clusters gérés offrent un hébergement de service hautement disponible, maintenu par Edgegap, avec un support en direct 24 h/24, 7 j/7 pour les jeux publiés.

Les exigences en ressources pour votre instance dépendront de facteurs :

* **nombre de joueurs** - davantage de joueurs entraîne plus de tickets et de requêtes API,
* **nombre de requêtes par joueur** - des nouvelles tentatives plus rapides augmentent la charge du service et consomment des ressources,
* **complexité de la configuration** - les règles d’intersection et les extensions sont particulièrement exigeantes,
* **durée moyenne d’un match** - des sessions plus courtes font que les joueurs rejoignent plus souvent le matchmaking,
* **périodes d’expiration et de suppression** - les tickets obsolètes s’accumulent avec le temps et consomment des ressources,
* **logique de repli des tentatives de réessai du client** - réessayer avec un backoff avec jitter aide à répartir les pics de trafic.

{% hint style="warning" %}
**Préparez-vous au succès et optimisez après le lancement, afin de ne pas bloquer vos joueurs le jour de la sortie.** Utilisez [Outils de développement](/docs.edgegap.com-fr/unity/developer-tools.md#matchmaking-sdk) ou **mettre en œuvre un backoff exponentiel avec jitter** pour vous remettre d’une forte charge.
{% endhint %}

{% hint style="info" %}
Nos clusters utilisent des machines cloud équipées de processeurs AMD/Intel avec une fréquence d'horloge de 2,4 à 3,2 GHz.
{% endhint %}

## ⏩ Mises à jour progressives <a href="#rolling-updates-and-ab-tests" id="rolling-updates-and-ab-tests"></a>

Suivre la compatibilité entre les versions serveur et client peut devenir compliqué. Suivez nos conseils pour des mises en production fiables, des mises à jour et pour éviter les temps d’arrêt ou les problèmes de compatibilité.

**L’URL et le jeton d’authentification de votre Matchmaker resteront toujours les mêmes après un redémarrage.**

{% hint style="danger" %}
**Créez des matchmakers distincts pour le développement et la production** afin d’expérimenter en toute sécurité.
{% endhint %}

#### ⚠️ **Avant la mise en ligne**

Nous recommandons de créer à l’avance plusieurs copies de votre matchmaker : `vert`, `bleu` et `orange`. Vous pouvez faire tourner le matchmaker utilisé au fur et à mesure que vous publiez des mises à jour ([stratégie bleu/vert](https://en.wikipedia.org/wiki/Blue%E2%80%93green_deployment)).

**Choisissez différentes régions pour chaque instance afin d’éviter les interruptions** lors de pannes localisées.

<figure><img src="/files/27a0e8e25ae2523767bcffd11b1a9e4dcb56547c" alt=""><figcaption><p>Exemple d’environnement DevOps bleu/vert</p></figcaption></figure>

#### **🔃 Mise à jour client + serveur**

**Prérequis :** Cette section suppose que vous avez terminé [#before-going-live](#before-going-live "mention").

Afin de **publier des mises à jour du client et du serveur du jeu**, vous pouvez :

1. Préparer une nouvelle version de l’application serveur `v1.2.0-rc` sur Edgegap :
   1. publier un nouveau tag d’image dans votre registre de conteneurs `t1.2.0`,
   2. créer une nouvelle version de l’application `v1.2.0-rc`,
2. Effectuez tous les tests de développement en [déployant votre nouvelle version de l’application](https://app.edgegap.com/deployment-management/deployments/list) `v1.2.0-rc`:
   1. connectant l’Éditeur de votre moteur de jeu à l’URL et au port externe fournis,
3. Mettre à jour le matchmaker inutilisé `bleu` pour le lier à votre nouveau tag d’image `t1.2.0`,
   1. activer la mise en cache pour la nouvelle version de l’application `v1.2.0-rc` , l’activation du cache pour cette version garantira également que l’image est mise en cache pour la version `v-blue`  puisqu’ils font référence au même tag,
   2. attendre que l’indicateur de mise en cache de la version `v1.2.0-rc`  atteigne :green\_circle: vert,
4. Mettre à jour votre nouveau client de jeu `c2` pour utiliser la nouvelle version `v-blue` lors de la création de tickets :
   1. mettez à jour l’URL de base et le jeton d’autorisation dans le client de jeu,
5. Effectuez des tests QA et les vérifications finales de votre nouveau client de jeu `c2`:
   1. si vous trouvez et résolvez des problèmes, recommencez le processus depuis le début,
   2. attendez 3 à 7 jours pour propager les changements DNS du matchmaker aux FAI du monde entier, après l’arrêt du matchmaker (un redémarrage rapide ne nécessite pas de mises à jour DNS ni de période d’attente),
6. Publiez la mise à jour de votre nouveau client de jeu `c2` sur les plateformes de distribution de jeux,
7. Laissez du temps au nouveau client de jeu `c2` pour se distribuer sur les appareils des joueurs (généralement jusqu’à 3 à 7 jours) :
   1. surveiller les anciens clients de jeu `c1`  en utilisant le déploiement [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#analytics),
8. Nettoyez les ressources inutilisées dans votre compte Edgegap :
   1. supprimez le tag d’image `t1.0.0` pour libérer de la capacité dans le registre de conteneurs,
   2. supprimez le tag d’image `t1.1.0` pour libérer de la capacité dans le registre de conteneurs,
   3. désactivez votre `vert`  matchmaker afin de suspendre la facturation jusqu’à votre prochaine mise à jour.

{% hint style="success" %}
**Pour votre prochaine mise à jour**, augmentez les numéros de version et échangez `vert` et `bleu` les mots-clés dans le guide.
{% endhint %}

#### **⚡ Correctif serveur**

**Prérequis :** Cette section suppose que vous avez terminé [#before-going-live](#before-going-live "mention").

Pour **publier un correctif serveur sans nécessiter de mise à jour du client de jeu**, vous pouvez :

1. Préparer une nouvelle version de l’application serveur `v1.2.0-rc` sur Edgegap :
   1. publier un nouveau tag d’image dans votre registre de conteneurs `t1.2.0`,
   2. créer une nouvelle version de l’application `v1.2.0-rc`,
2. Effectuez les tests et les vérifications en [déployant votre nouvelle version de l’application](https://app.edgegap.com/deployment-management/deployments/list) `v1.2.0-rc`:
   1. connectant l’Éditeur de votre moteur de jeu à l’URL et au port externe fournis,
   2. si vous trouvez et résolvez des problèmes, recommencez le processus depuis le début,
   3. activer la mise en cache pour la nouvelle version de l’application `v1.2.0-rc` , l’activation du cache pour cette version garantira également que l’image est mise en cache pour la version `v-green`  plus tard, puisqu’ils feront référence au même tag,
   4. attendre que l’indicateur de mise en cache de la version `v1.2.0-rc`  atteigne :green\_circle: vert,
3. Mettre à jour la version `v-green`  pour le lier à votre nouveau tag d’image `t1.2.0`,
   1. les nouveaux matchs lanceront automatiquement l’affectation avec le tag mis à jour `t1.2.0`,
   2. surveiller les anciens clients de jeu `c1`  en utilisant le déploiement [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#analytics),
4. Nettoyage des ressources inutilisées dans votre compte Edgegap :
   1. supprimez le tag d’image `t1.1.0` pour libérer de la capacité dans le registre de conteneurs.

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

Les clients et les serveurs peuvent appeler l’API directement ou via les SDK des moteurs de jeu, voir aussi [Appariement](/docs.edgegap.com-fr/learn/appariement.md).

{% hint style="info" %}
Unity/Android - envisager [d'utiliser l'interpolation de chaîne brute](https://www.c-sharpcorner.com/article/convert-string-to-json-in-c-sharp/) pour empêcher la suppression de code des JSON codés en dur.
{% endhint %}

{% hint style="success" %}
**Interface Web Swagger**: le déploiement de votre service générera une spécification openAPI et une interface Web pratique. Ouvrez l’URL dans votre navigateur pour afficher et tester tous les points de terminaison de l’API, et pour consulter des exemples de payload.
{% endhint %}

{% tabs fullWidth="false" %}
{% tab title="🍀 Exemple simple" %}
{% file src="/files/c776940067ab24f54a0b268cc95579eada4a9ab8" %}
{% endtab %}

{% tab title="🏁 Exemple avancé" %}
{% file src="/files/43a41be367fb0ab7ac7fe32c25db07d1022d3652" %}
{% endtab %}

{% tab title="🎾 Salon personnalisé" %}
{% file src="/files/5f68d3a239309e71119084a21efbae380261d3a4" %}
{% endtab %}

{% tab title="🥛 Présentation du remplissage arrière" %}
{% file src="/files/e9d3c906be28faebd6eed9111e2ad013c21b8429" %}
{% endtab %}

{% tab title="⚔️ Jeux compétitifs" %}
{% file src="/files/9255b1fccca0102825e4be46ee077114e5d6bdf6" %}
{% endtab %}

{% tab title="🤝 Jeux coopératifs" %}
{% file src="/files/5d31c1ca46c0df8f2b109eef58ceeff55b93cadf" %}
{% endtab %}

{% tab title="🎈 Jeux sociaux" %}
{% file src="/files/43de6f310a0549e5fd3d21d8240e53b89420af62" %}
{% endtab %}
{% endtabs %}

Importer la spécification de l'API vers [Client Web de l'API Scalar](https://client.scalar.com/workspace/default/request/default) ou [Éditeur Swagger](https://editor.swagger.io/) pour inspecter les détails.

### Limites de débit

Pour protéger votre cluster contre le dépassement de sa capacité de pointe et un crash, nous limitons le nombre de requêtes par seconde sur la base de nos tests de charge internes utilisant [Appariement](/docs.edgegap.com-fr/learn/appariement.md#advanced-example) la configuration.

<table><thead><tr><th>Point de terminaison API</th><th width="130">Niveau gratuit</th><th width="130">Niveau amateur</th><th width="130">Niveau studio</th><th width="130">Niveau entreprise</th></tr></thead><tbody><tr><td><strong>Limite globale</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>Créer un déploiement</td><td>5</td><td>10</td><td>30</td><td>30</td></tr><tr><td>Lister les balises</td><td>10</td><td>20</td><td>75</td><td>200</td></tr><tr><td>Créer un groupe\n+ Créer un ticket\n+ Créer un ticket de groupe</td><td>10</td><td>20</td><td>75</td><td>200</td></tr><tr><td>Lire l’adhésion\n+ Lire le groupe\n+ Lire le ticket</td><td>10</td><td>120</td><td>450</td><td>1,300</td></tr><tr><td>Créer un backfill</td><td>5</td><td>10</td><td>37</td><td>100</td></tr></tbody></table>

Les limites de débit sont exprimées en **requêtes combinées par seconde vers l’ensemble spécifié de points de terminaison API**.

{% hint style="warning" %}
Si vos clients de jeu ne réessaient pas les requêtes après avoir reçu la réponse `429 Trop de requêtes` **vos déploiements peuvent manquer des joueurs** lors de courtes poussées et des périodes de pic de trafic.
{% endhint %}

#### Tests de charge

Les tests de charge dans un environnement similaire à la production entraînent un coût d’hébergement du déploiement. Consultez les ressources et les prix associés à chaque niveau sur [notre page de tarification](https://edgegap.com/resources/pricing#matchmaker).

{% hint style="warning" %}
**Utilisez** [**des clusters privés**](#private-cluster-tiers) **pour les tests de stress.** Les instances gratuites sont strictement limitées aux tests de développement uniquement.
{% endhint %}

Lors de la conception de votre test de charge, **veuillez prendre en compte des comportements de joueurs réalistes**:

| Scénario réaliste                                                                                                           | Schéma de trafic irréaliste                                                                                                |
| --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| ✅ Les joueurs rejoignent la partie progressivement, augmentant les requêtes/s sur plusieurs heures.                         | ❌ Tous les joueurs se coordonnent et sollicitent l’API exactement à la même seconde.                                       |
| ✅ Les joueurs attendent un temps croissant entre leurs nouvelles tentatives (p. ex. 1 s - 5 s - 10 s - 10 s).               | ❌ Tous les joueurs réessaient immédiatement après avoir reçu `429 Trop de requêtes`  la réponse.                           |
| ✅ La plupart des joueurs recevront leur affectation en peu de temps (10 à 60 s) et cesseront d’interroger le serveur.       | ❌ Tous les joueurs continuent d’interroger le serveur pendant une durée déterminée même après avoir reçu leur affectation. |
| ✅ La plupart des joueurs terminent leur partie (en prenant du temps) avant de redémarrer une nouvelle session.              | ❌ Tous les joueurs redémarrent immédiatement leur session dès qu’ils reçoivent l’affectation du serveur.                   |
| ✅ Le trafic de pointe est maintenu pendant environ 6 heures par jour, après quoi certains fuseaux horaires se déconnectent. | ❌ Le trafic de pointe est maintenu 24 heures sur 24, avec tous les joueurs jouant jour et nuit.                            |

#### Comportement sous charge

Si un matchmaker subit une forte charge :

* si le processeur est bridé, le matchmaking peut ralentir,
* si le matchmaker manque de mémoire, il redémarrera sans perdre les informations des tickets, en espérant que les clients implémenteront un backoff exponentiel et que la poussée sera étalée sur une période plus longue.

#### Partage de ressources entre origines croisées (CORS)

Pour les jeux WebGL hébergés sur des plateformes de distribution tierces (par ex. [itch.io](http://itch.io/)), l’envoi de requêtes au Matchmaker depuis le client de jeu peut entraîner [Partage de ressources entre origines croisées](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) des violations de politique. La plupart des navigateurs web modernes envoient une [requête de pré-vérification](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request) pour vérifier qu’un service backend (le Matchmaker) comprend et accepte la communication de votre client de jeu.

L’échec de la vérification de pré-vérification (comportement par défaut pour des raisons de sécurité) peut entraîner [l’une de plusieurs erreurs possibles liées à CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin), le plus souvent `en-tête CORS 'Access-Control-Allow-Origin' manquant` .

Pour résoudre cette erreur, ajoutez **`allowed_cors_origin`** paramètre à votre configuration pour :

* autoriser explicitement vos domaines d’hébergement client exacts :

<details>

<summary>🍀 Exemple simple (exemple de domaines spécifiques)</summary>

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

</details>

* ou autoriser explicitement un domaine générique (y compris tous les sous-domaines) :

<details>

<summary>🍀 Exemple simple (exemple de domaine générique)</summary>

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

</details>

{% hint style="info" %}
**Aucun identifiant n’est requis pour les requêtes de pré-vérification du Matchmaker**, si les domaines sont correctement configurés.
{% endhint %}

### Serveur à serveur <a href="#server-to-server-api" id="server-to-server-api"></a>

Ajoutez des contrôles améliorés ou personnalisés sur le flux de matchmaking - implémentez un proxy personnalisé à l’aide de notre [Clusters gérés](/docs.edgegap.com-fr/learn/advanced-features/managed-clusters.md) ou de tout cloud FaaS[^12] plateforme de calcul, afin d’obtenir l’un des éléments suivants :

* associer des attributs sensibles du joueur - tels que des indicateurs de triche, des notes de compétence ou similaires,
* fournir en jeu le contexte de l’équipe et du match - afficher mes coéquipiers et mes adversaires pendant le chargement,
* restreindre des cas particuliers - par ex. n’autoriser qu’un seul groupe par joueur à tout moment,
* ajouter du cache ou une limitation du débit de l’API - réduire le nombre de requêtes et la charge sur le matchmaker,
* personnaliser l’intégration lobby-groupe - créer des salons asymétriques/basés sur des rôles avant le matchmaking.

{% hint style="success" %}
**Inclure le paramètre `player_ip`  avec l’adresse IP publique du membre** afin d’assurer la latence joueur la plus faible possible et de tirer parti de [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-server-score-strategy-best-practice](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-server-score-strategy-best-practice "mention").
{% endhint %}

{% hint style="info" %}
Les clients de jeu peuvent utiliser [ipify.org](http://ipify.org/) le service gratuit pour trouver leur IP publique. Les VPN peuvent masquer l’adresse IP publique.
{% endhint %}

<figure><img src="/files/a1e4a8060cb051104078a1375c254eea1c76aafa" alt=""><figcaption><p>Diagramme d’activité du matchmaking serveur à serveur</p></figcaption></figure>

## 🚨 Dépannage

**Votre réussite est notre priorité.** Si vous souhaitez envoyer des requêtes personnalisées, demander des fonctionnalités critiques manquantes ou partager des idées, [contactez-nous sur notre Discord communautaire](https://discord.gg/MmJf8fWjnt).

<details>

<summary><code>La configuration de l'application n'est pas valide pour le profil XYZ.</code></summary>

* Nous n'avons pas trouvé votre [Applications et versions](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md), veuillez vérifier `application`  valeurs.

</details>

<details>

<summary><code>L'image Docker pour '2024.01.30-16.23.00-UTC' n'est pas mise en cache.</code></summary>

[**🌟 Passez au niveau Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **pour débloquer** [**déploiements instantanés avec mise en cache**](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-start-a-deployment)**.**

* Les images non mises en cache de plus de 4 Go peuvent prendre plus de temps à se déployer, entraînant [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error "mention"). Envisagez d'optimiser la taille de votre image serveur ([Unreal Engine](/docs.edgegap.com-fr/unreal-engine.md#optimize-server-build-size) / [Unity](/docs.edgegap.com-fr/unity.md#optimize-server-build-size)).
* Vous pouvez procéder malgré tout, bien que nous recommandions de tester le temps de déploiement.

</details>

<details>

<summary>Pourquoi est-ce que j’obtiens des erreurs en essayant de créer un nouveau matchmaker ?</summary>

* Veuillez lire l’erreur, il est possible que vous ayez mal orthographié un identifiant, une règle ou un opérateur. - Utilisez [JSONLint](https://jsonlint.com/) pour valider le formatage de votre JSON, il se peut qu’il manque une virgule ou une accolade. - Contactez-nous via [notre Discord communautaire](https://discord.gg/MmJf8fWjnt) pour obtenir de l’aide, nous serons ravis de vous assister. 🙏

</details>

<details>

<summary>Pourquoi mon matchmaker s’est-il éteint automatiquement après 3 heures ?</summary>

* Les matchmakers du niveau gratuit sont destinés aux tests initiaux et sont automatiquement éteints après 3 heures. Pour continuer les tests, vous pouvez [redémarrer votre matchmaker](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).
* Envisagez de passer à un niveau payant pour une durée d’exécution illimitée.

</details>

<details>

<summary>Pourquoi ne puis-je pas démarrer un deuxième déploiement sur mon compte ?</summary>

* Vous ne pouvez exécuter qu’un seul déploiement simultané dans le niveau gratuit.
* Veuillez envisager de passer à un niveau payant pour des déploiements illimités.

</details>

<details>

<summary>Pourquoi est-ce que j’obtiens des affectations/déploiements à des moments aléatoires, en ignorant <code>player_count</code>?</summary>

* Vous ou un autre membre de l’équipe avez peut-être créé des tickets lors d’une session de test précédente qui n’ont pas été attribués. Veuillez [redémarrer votre matchmaker](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).

</details>

<details>

<summary>Mon ticket est bloqué en <code>SEARCHING</code> .</summary>

* Veuillez vérifier que vous avez créé suffisamment de tickets correspondants en respectant votre configuration.

</details>

<details>

<summary>Mon ticket est bloqué en alternance entre <code>MATCH_FOUND</code> et <code>TEAM_FOUND</code> de manière répétée.</summary>

* Les comptes du niveau gratuit sont limités à 1 déploiement à la fois.
* Veuillez envisager une mise à niveau ou arrêtez votre déploiement actuel pour en lancer un nouveau.

</details>

<details>

<summary>Mon ticket passe directement à <code>ANNULÉ</code>.</summary>

* Votre ticket a atteint son expiration. Créez un nouveau ticket ou augmentez la période d’expiration dans votre configuration à des fins de test.

</details>

<details>

<summary>Je reçois <code>HTTP 404 Introuvable</code> lors de la vérification de mon ticket.</summary>

* Votre ticket a été supprimé soit par une requête DELETE, soit en atteignant sa période de suppression (qui commence après l’expiration du ticket, définie dans votre configuration). Recréez un nouveau ticket ou augmentez les périodes d’expiration/suppression dans votre configuration à des fins de test.

</details>

<details>

<summary>Mon matchmaker affiche une erreur, que dois-je faire ?</summary>

* S’il s’agit d’une instance de développement ou de test, essayez d’abord de redémarrer votre matchmaker. - Veuillez signaler tout problème via [notre Discord communautaire](https://discord.gg/MmJf8fWjnt).
* Si ce problème impacte un jeu en production, créez une [demande d’assistance urgente](https://edgegap.atlassian.net/servicedesk/customer/portal/3).

</details>

## 🔖 Journal des modifications

#### Versionnage sémantique

Nos outils de développement et nos services managés utilisent les officielles [Versionnage sémantique](https://semver.org/), indiquant quelles mises à jour sont ✅ sûres (mineures, correctifs) et lesquelles peuvent contenir des ⚠️ changements incompatibles (majeurs).

**Une fois qu'une version est publiée, elle ne sera jamais modifiée/changée**.

Votre fichier de configuration sera validé en fonction de la version du matchmaker utilisée ; assurez-vous que vos règles correspondent aux capacités de la version du matchmaker.

{% hint style="info" %}
**La dernière version du matchmaker est `3.2.5`**. Tous les exemples de cette page sont à jour.

Restez attentif à [mises à jour et annonces](/docs.edgegap.com-fr/docs/release-notes.md). Voir aussi [#rolling-updates-and-ab-tests](#rolling-updates-and-ab-tests "mention").
{% endhint %}

{% hint style="warning" %}
**Pour mettre à niveau votre version de matchmaker - Arrêter, Modifier, Redémarrer.** Le redémarrage rapide n’appliquera pas les changements de version.
{% endhint %}

[^1]: valeur d'exemple

[^2]: les clients de jeu rejoignent un lobby pour récupérer l’ID du groupe de matchmaking et rejoindre le groupe

[^3]: Nom de domaine pleinement qualifié

[^4]: par exemple pour 3 emplacements libres = \["3", "2", "1"]

[^5]: remplacez "2" par le nombre réel de membres du groupe

[^6]: remplacez par le nom de votre propre application

[^7]: remplacez par la version de votre propre application

[^8]: différence maximale dépassée

[^9]: latence maximale dépassée

[^10]: Fournisseur de services Internet

[^11]: voir d’autres exemples

[^12]: [Function as a Service](https://www.ibm.com/think/topics/faas)
