> 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/fr/learn/navigateur-de-serveurs.md).

# Navigateur de serveurs

Commencez rapidement avec Server Browser et explorez des scénarios d'exemple pour divers genres.

Server Browser est un service géré pour [Déploiements](/fr/learn/orchestration/deployments.md#match-bound) et [Persistants](/fr/learn/orchestration/persistance.md) serveurs :

* **aider les joueurs à rechercher et à rejoindre des serveurs adaptés** en fonction de la capacité, de la latence ou des paramètres de jeu ;
* **préchauffer de nouveaux serveurs** pour servir des audiences mondiales à grande échelle et éviter des files d'attente frustrantes ;
* **simplifier les opérations serveur** y compris les mises à jour, les redémarrages, la persistance, le maillage et plus encore.

{% hint style="success" %}
Vous cherchez à faire correspondre les joueurs selon des règles strictes, sans leur laisser le choix du serveur ? Pensez à [Matchmaking](/fr/learn/matchmaking.md).
{% endhint %}

## ✔️ Préparation

**Tester ce service est entièrement gratuit, aucune carte de crédit requise.**

Le niveau gratuit permet jusqu'à 3 heures d'exécution sur notre cluster de test partagé, après chaque redémarrage.

Ce tutoriel suppose que vous avez déjà :

* [compris le modèle de déploiement d'Edgegap](https://docs.edgegap.com/fr/learn/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-just-in-time-deployment-dedicated-servers),
* publié votre application serveur sur Edgegap ([Unreal Engine](/fr/unreal-engine.md), [Unity](/fr/unity.md)),
* connecté avec succès un client de jeu à votre serveur sur Edgegap.

### Fonctions et flux

<figure><img src="/files/95fe1d252b52c4a91d58b828c15b5f2a2160329f" alt=""><figcaption><p>Server Browser : flux et hiérarchie</p></figcaption></figure>

Server Browser offre deux fonctionnalités principales :

[#start-browsing](#start-browsing "mention") avec les clients de jeu pour :

* Découvrir et trouver des instances de serveur adaptées, voir les emplacements et réserver la capacité disponible.
* Réserver des places dans un emplacement d'instance, récupérer les détails de connexion et se connecter aux serveurs.
* Authentifier les connexions des joueurs dans les déploiements à l'aide de [Identité fédérée](#user-content-fn-1)[^1].
* Mettre à jour la capacité disponible et/ou les métadonnées des emplacements d'instance afin de modifier les critères de découverte.

[#automated-scaling](#automated-scaling "mention") (facultatif) avec les politiques de mise à l'échelle pour :

* Surveiller les instances de serveur disponibles, les emplacements, la capacité - par région et/ou selon d'autres critères.
* Déployer des serveurs pour augmenter la capacité avec le préchauffage ou la mise à l'échelle juste-à-temps.
* Automatiser les opérations avec des politiques spéciales pour les démos, les mises à jour, les tests, l'assurance qualité, les tournois, et plus encore.

{% hint style="info" %}
Après la sortie, **votre navigateur de serveurs devra fonctionner 24 h/24 et 7 j/7** pour garantir que les joueurs du monde entier puissent rejoindre des serveurs.
{% endhint %}

## ▶️ Commencer la navigation

Apprenez le cycle de vie serveur/joueur et leurs responsabilités afin d'assurer une utilisation efficace des serveurs.

### 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-2">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 %}

Server Browser génère automatiquement deux types de jetons :

* **Jeton serveur** - requis pour [API serveur](#server-lifecycle) méthodes, peuvent être [injectés comme variable de version d'application](/fr/learn/orchestration/application-and-versions.md#injected-variables).
  * Donne accès à toutes les méthodes de l'API et est pratique pour les tests, le DevOps ou l'orchestration personnalisée.
* **Jeton client** - requis pour [API de surveillance et API de réservation de places](#player-lifecycle) utilisé par les clients de jeu.
  * Nous recommandons de stocker ce jeton dans un coffre-fort de secrets tiers afin de faciliter la rotation des jetons.

### Découvrir l'instance

{% hint style="warning" %}
**Nouveau** [Déploiements](/fr/learn/orchestration/deployments.md) **doit créer une nouvelle instance** lors de l'initialisation pour suivre la capacité ajoutée.
{% endhint %}

{% hint style="info" %}
Voir [#automated-scaling](#automated-scaling "mention") pour en savoir plus sur les politiques de mise à l'échelle et lancer automatiquement les déploiements.
{% endhint %}

**Informations requises** pour chaque instance de serveur comprennent :

* au moins un slot défini lors de l'initialisation de l'instance,
* détails de connexion au serveur - URL, IP, informations de port et emplacement.

**Paramètres de métadonnées personnalisées facultatifs** pour le filtrage, le tri et la navigation des joueurs ; par exemple :

* informations sur les slots - capacité de l'équipe et métadonnées spécifiques à l'équipe (p. ex. nom de l'équipe),
* nom et tags - étiquettes personnalisables, uniques, lisibles par l'humain et recherchables ;
* données de compatibilité - version du serveur ou versions clientes prises en charge ;
* qualificatifs de latence - identifiants de ville et de région, et détails assignés [Balises de ping](/fr/learn/orchestration/ping-beacons.md) détails ;
* paramètres de jeu - niveau/scène/carte, mode de jeu, difficulté, mods utilisés ;
* tout autre paramètre personnalisé pour aider les joueurs à filtrer et à trouver un serveur adapté.

{% hint style="info" %}
Les paramètres de métadonnées ci-dessus ne sont que des exemples ; vous pouvez définir autant de paramètres que nécessaire.
{% endhint %}

{% hint style="success" %}
Pour sérialiser des objets imbriqués, essayez d'encoder leur chemin d'accès dans la clé comme `"object.child.property"`.
{% endhint %}

Les serveurs peuvent **mettre à jour les métadonnées de l'instance ou du slot à tout moment** pour modifier leurs critères de découvrabilité. Lors de la mise à jour des métadonnées, toutes les clés indexées doivent être fournies avec des valeurs valides (même si elles ne sont pas modifiées).

**Les instances de serveur doivent périodiquement envoyer un signal de maintien en vie** pour vérifier leur disponibilité continue et empêcher les joueurs de rejoindre des serveurs en panne ou hors ligne. L'absence de signal pendant la période d'expiration configurée supprimera automatiquement l'instance et toute réservation de place en attente.

{% hint style="info" %}
Voir [Persistance](/fr/learn/orchestration/persistance.md) pour gérer l'état persistant du monde et [Applications et versions](/fr/learn/orchestration/application-and-versions.md#active-caching) pour des déploiements plus rapides.
{% endhint %}

### Allouer la capacité

La capacité des instances et des slots peut être allouée de deux façons, utilisées individuellement ou combinées :

* [#auto-assigned-reservation](#auto-assigned-reservation "mention") pour choisir un serveur démarré avec une politique de mise à l'échelle spécifique,
* [#search-and-browse](#search-and-browse "mention") pour laisser le joueur définir des filtres et parcourir les serveurs adaptés parmi lesquels choisir.

{% hint style="success" %}
Nous recommandons de commencer avec [#auto-assigned-reservation](#auto-assigned-reservation "mention") comme l'option la plus simple.
{% endhint %}

#### Réservation auto-attribuée

{% hint style="info" %}
Implémentez cette fonctionnalité si vous souhaitez **choisir automatiquement le serveur**, en fonction de la capacité régionale.
{% endhint %}

Les joueurs peuvent créer une réservation auto-attribuée, en fournissant uniquement des ID de joueur et un nom de politique de mise à l'échelle. Server Browser trouvera automatiquement une instance avec un slot offrant une capacité joignable suffisante et réservera des places, en répondant immédiatement avec les détails de connexion à l'instance.

S'il n'existe aucun slot d'instance adapté pour cette réservation, la réponse :

* **le code d'état indique si la politique procède à une montée en charge** et davantage de capacité sera ajoutée,
* **en-tête `Retry-After`  indique la période d'attente (en secondes) avant de réessayer**, si réessayable.

Une fois une réservation terminée, vous pouvez passer à [#connect-to-server](#connect-to-server "mention").

#### Recherche et navigation

{% hint style="info" %}
Implémentez cette fonctionnalité si vous souhaitez **afficher aux utilisateurs une liste de serveurs et permettre des réservations personnalisées**.
{% endhint %}

Les joueurs peuvent lister les instances de serveur et [parcourir les résultats par pages](#pagination) pour trouver un serveur qu'ils souhaitent rejoindre.

Les instances et les slots peuvent être filtrés et triés avec des paramètres intégrés ou des [métadonnées indexées](#configuration):

<table><thead><tr><th width="400">Propriété</th><th width="140">Type de données</th><th width="105">Instance</th><th width="105">Slot</th></tr></thead><tbody><tr><td><code>request_id</code></td><td><code>chaîne</code></td><td>✅</td><td>❌</td></tr><tr><td><code>total_joinable_seats</code>, <code>total_available_seats</code></td><td><code>entier</code></td><td>✅</td><td>❌</td></tr><tr><td><code>name</code></td><td><code>chaîne</code></td><td>❌</td><td>✅</td></tr><tr><td><code>available_seats</code>, <code>reserved_seats</code></td><td><code>entier</code></td><td>❌</td><td>✅</td></tr><tr><td><code>created_at</code>, <code>updated_at</code></td><td><code>chaîne</code></td><td>✅</td><td>✅</td></tr><tr><td><code>metadata.{index}</code> (personnalisé)</td><td><code>chaîne</code>, <code>entier</code>, <code>flottant</code>, <code>booléen</code></td><td>✅</td><td>✅</td></tr></tbody></table>

Les opérateurs de filtrage disponibles dépendent du type de données de la propriété filtrée :

<table><thead><tr><th width="125">Paramètre</th><th width="135">Opérateurs</th><th>Filtre d'exemple (basé sur l'exemple simple)</th></tr></thead><tbody><tr><td><code>chaîne</code></td><td><p><a data-footnote-ref href="#user-content-fn-3"><code>eq</code></a>  ou <a data-footnote-ref href="#user-content-fn-4"><code>ne</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-5"><code>lt</code></a>  ou <a data-footnote-ref href="#user-content-fn-6"><code>le</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-7"><code>gt</code></a>  ou <a data-footnote-ref href="#user-content-fn-8"><code>ge</code></a>  ou<br><code>contient</code></p></td><td><pre><code>?$filter=metadata.custom_name contains 'my game'
and metadata.server_version le '1.1.0'
and metadata.server_version ge '1.0.0'
&#x26;$order=metadata.custom_name asc
</code></pre></td></tr><tr><td><code>entier</code>, <code>flottant</code></td><td><p><a data-footnote-ref href="#user-content-fn-3"><code>eq</code></a>  ou <a data-footnote-ref href="#user-content-fn-4"><code>ne</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-5"><code>lt</code></a>  ou <a data-footnote-ref href="#user-content-fn-6"><code>le</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-7"><code>gt</code></a>  ou <a data-footnote-ref href="#user-content-fn-8"><code>ge</code></a>  </p></td><td><pre><code>?$filter=metadata.xp_multiplier gt 1.0
&#x26;$order=metadata.xp_multiplier desc
</code></pre></td></tr><tr><td><code>booléen</code></td><td><a data-footnote-ref href="#user-content-fn-3"><code>eq</code></a>  ou <a data-footnote-ref href="#user-content-fn-4"><code>ne</code></a></td><td><pre><code>?$filter=metadata.allows_new_connections eq true
</code></pre></td></tr></tbody></table>

{% hint style="success" %}
Filtrez par les métadonnées des régions et/ou des villes pour réduire la sélection avant de mesurer la latence vers les serveurs.
{% endhint %}

{% hint style="info" %}
Découvrez les méthodes basées sur le curseur [#pagination](#pagination "mention") pour permettre aux utilisateurs de récupérer davantage de résultats.
{% endhint %}

#### Réserver des places

Avant de rejoindre un serveur, une réservation de place est requise pour garantir que l'instance offre une capacité disponible suffisante. Les réservations peuvent inclure un groupe de joueurs ou un individu seul.

Identité fédérée : les joueurs doivent fournir un ID de joueur tiers unique dans leur réservation. En envoyant le même ID une fois qu'ils [#connect-to-server](#connect-to-server "mention") cela permettra au serveur de vérifier leur identité.

Une fois une réservation effectuée avec succès ([200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200)), les joueurs doivent essayer de se connecter immédiatement. Les réservations en attente **expirent après 30 secondes (configurable) à moins d'être confirmées** par votre serveur.

**Les réservations dépassant la capacité de places joignables du slot seront automatiquement rejetées** ([409 Conflict](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/409)). Les places joignables sont toutes les places disponibles qui n'ont pas encore été réservées par d'autres joueurs.

{% hint style="info" %}
Le serveur peut modifier de force la capacité de n'importe quel slot, ajouter, supprimer ou mettre à jour n'importe quels slots. **Toutes les réservations pour un slot donné seront supprimées si des réservations en attente dépassent la nouvelle capacité disponible du slot.**
{% endhint %}

### Se connecter au serveur

Une fois qu'un joueur a trouvé une instance adaptée, il **récupère les détails de connexion requis à partir de** (URL ou IP, [Port externe](/fr/learn/orchestration/application-and-versions.md#port-mapping)). Dès que la réservation de place est effectuée, **les joueurs peuvent se connecter au serveur de jeu de votre déploiement et transmettre leur ID de joueur**.

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

{% hint style="success" %}
En cas d'échec de connexion ou d'écran noir, consultez notre [guide de dépannage](/fr/unreal-engine.md#troubleshooting-and-faq-1).
{% 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 `composant NetworkManager`  .
* **Port externe** mappé vers le [port d'écoute interne du serveur](https://docs.edgegap.com/learn/advanced-features/application-and-versions#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](/fr/unity.md#troubleshooting-and-faq-4).
{% endhint %}
{% endtab %}
{% endtabs %}

Pour authentifier les nouvelles connexions, **votre serveur doit envoyer une demande de confirmation de réservation en lot** avec les ID de tous les nouveaux joueurs, en recevant des informations dans la réponse de confirmation :

* assignation des réservations de joueurs acceptées à leur slot préféré,
* assignation des réservations de joueurs expirées à leur slot préféré,
* une liste d'ID de joueurs inconnus.

Votre **serveur peut décider comment traiter chaque groupe de joueurs** et s'il faut autoriser ou expulser/interdire les utilisateurs expirés ou rejetés. Chacun des **slots de l'instance doit être mis à jour immédiatement avec le nouveau nombre de places disponibles** pour garantir que les futures réservations ne dépasseront pas la capacité du slot.

### Abandonner le serveur

Lorsque les joueurs quittent, votre serveur doit augmenter la capacité de places disponibles pour le slot assigné.

{% hint style="success" %}
Si la conception de votre jeu permet une période de reconnexion, votre serveur peut attendre avant de mettre à jour les slots.
{% endhint %}

En savoir plus sur [Persistance](/fr/learn/orchestration/persistance.md#recovery-objectives) pour éviter des retours en arrière persistants frustrants du serveur.

## 🚀 Mise à l'échelle automatisée

Server Browser est compatible avec plusieurs méthodes différentes d'automatisation de la mise à l'échelle :

* **méthode de préchauffage** - démarrage des serveurs uniquement avec les politiques de mise à l'échelle de Server Browser,
* **méthode juste-à-temps** - démarrage via [Matchmaking](/fr/learn/matchmaking.md) et [remplissage avec Server Browser](#allocate-capacity),
* **autoscaleur personnalisé** - démarrage via un backend de jeu personnalisé et [remplissage avec Server Browser](#allocate-capacity).

Le guide suivant se concentrera sur **le préchauffage avec les politiques de mise à l'échelle** comme méthode principale.

{% hint style="success" %}
Apprenez à arrêter les déploiements dans [Unreal Engine](/fr/unreal-engine.md#stop-deployments), [Unity](/fr/unity.md#stop-deployments), ou [avec l'API](/fr/docs/api/serveurs-dedies.md#delete-v1-self-stop-request_id-access_point_id) pour gérer le cycle de vie de manière fiable.
{% endhint %}

### Surveiller la capacité

Les politiques de mise à l'échelle actualisent en continu la liste de vos instances de serveur (déploiements découverts), en répétant toutes les [`monitoring_interval`](#user-content-fn-9)[^9] . Chaque politique nécessite un filtre utilisant la même [syntaxe de filtrage](#search-and-browse) que les joueurs utilisent lors de la recherche d'instances - par région, capacité ou autre critère.

Votre [`minimum_active_instances`](#user-content-fn-10)[^10]  peut être traité soit comme une :

* **capacité fixe** de déploiements que vous souhaitez conserver en fonctionnement en permanence,
* **veille de préchauffage** tampon de déploiement pour masquer les retards d'initialisation.

#### Capacité fixe

Conservez une quantité fixe de serveurs actifs pour les jeux avec [Persistance](/fr/learn/orchestration/persistance.md)particulièrement lorsque ces jeux permettent aux joueurs de provisionner [Persistance](/fr/learn/orchestration/persistance.md#community-servers).

Ce type de configuration de politique est aussi parfois utilisé pour l'assurance qualité, les tournois, les alphas fermées, les démos éditeur ou d'autres types d'événements et d'opérations à capacité limitée.

{% hint style="info" %}
La politique de mise à l'échelle vous aide à redémarrer et recycler automatiquement les serveurs plantés à la volée.
{% endhint %}

#### Veille de préchauffage

Démarrez les serveurs avant la demande des joueurs si :

* vous lancez une grande sortie et attendez un afflux rapide de joueurs sur une courte période,
* ou l'initialisation du serveur nécessite plus de 30 secondes ([sans inclure le temps de déploiement](#user-content-fn-11)[^11]),
* ou le jeu implémente des stratégies de maillage nécessitant des dépendances réseau en couches ou circulaires.

### Déployer des serveurs

De nouveaux déploiements seront lancés automatiquement lorsque la quantité d'instances de serveur surveillées*s* descend en dessous du minimum configuré d'instances actives. Tous les déploiements sont demandés immédiatement et réessayés indéfiniment à chaque intervalle de surveillance après l' [`deployment_registration_period`](#user-content-fn-9)[^9]  écoulé.

{% hint style="warning" %}
Vérifiez que les nouveaux déploiements [effectuent l'auto-découverte et créent des instances](#discover-instance) correspondant correctement au filtre de votre politique, sinon **votre politique peut boucler indéfiniment et créer une grande quantité de déploiements inutilisés**!&#x20;
{% endhint %}

Les politiques démarrent des déploiements avec [Fleets privées](/fr/learn/orchestration/fleets-privees.md) (avec Overflow to Cloud) ou directement vers le Cloud.

Les paramètres disponibles incluent ([voir la spécification de l'API](/fr/docs/api/serveurs-dedies.md#private-fleets)):

* [**application et version**](/fr/learn/orchestration/application-and-versions.md) - version de build, ressources et autres paramètres d'orchestration,
* **utilisateurs** - un seul ensemble de coordonnées géographiques pour [l'emplacement préféré du serveur](/fr/learn/orchestration/deployments.md#regional-standby),
* [**identifiants d'hôte privés**](/fr/learn/orchestration/fleets-privees.md) - laissez vide pour le cloud, ou spécifiez les hôtes dans la région souhaitée,
* [**tags**](/fr/learn/orchestration/deployments.md#dashboard-monitoring) - taguez avec le nom de la politique pour retrouver plus tard les déploiements lancés avec cette politique,
* [**variables d'environnement**](/fr/learn/orchestration/deployments.md#custom-variables) - transmettez des paramètres et secrets personnalisés aux serveurs,
* [**webhooks**](/fr/learn/orchestration/deployments.md#webhooks-and-postbacks) - avertissez votre backend de jeu (ou matchmaker) des événements du cycle de vie du déploiement,
* [**exiger des emplacements mis en cache**](/fr/learn/orchestration/application-and-versions.md#active-caching) - si vous préférez des déploiements plus rapides uniquement dans les emplacements mis en cache.

### Politiques d'exemple

Testez et modifiez ces politiques comme vous le souhaitez. La plupart des jeux utiliseront plusieurs politiques.

{% tabs %}
{% tab title="🍀 Pool QA" %}
Une politique simple pour conserver un serveur déployé en permanence pour les tests.

<pre class="language-json" data-title=""><code class="lang-json">{
  "name": "sb-qa-pool",
<strong>  <a data-footnote-ref href="#user-content-fn-12">"filter"</a>: "metadata.policy_name eq 'sb-qa-pool'",
</strong>  "deployment_request": {
    "private_host_ids": [],
    "application": <a data-footnote-ref href="#user-content-fn-13">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-14">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-15">user_data</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-qa-pool"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_SCALING_POLICY_NAME",
</strong><strong>        "value": "sb-qa-pool",
</strong>        "is_hidden": false
      }
    ]
  },
<strong>  "minimum_active_instances": 1
</strong>}
</code></pre>

{% endtab %}

{% tab title="🌡️ Préchauffage" %}
Lancez 10 déploiements avant la publication en prévision de la demande. À copier pour chaque région.

<pre class="language-json" data-title=""><code class="lang-json">{
  "name": "sb-v1.0.0-chicago",
<strong>  <a data-footnote-ref href="#user-content-fn-16">"filter"</a>: "total_joinable_seats gt 0 and metadata.policy_name eq 'sb-v1.0.0-chicago'",
</strong>  "deployment_request": {
    "private_host_ids": [],
    "application": <a data-footnote-ref href="#user-content-fn-13">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-14">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-15">user_data</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-v1.0.0-chicago"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_SCALING_POLICY_NAME",
</strong><strong>        "value": "sb-v1.0.0-chicago",
</strong>        "is_hidden": false
      }
    ]
  },
<strong>  <a data-footnote-ref href="#user-content-fn-17">"minimum_active_instances"</a>: 10
</strong>}
</code></pre>

{% endtab %}

{% tab title="🔒 MMO" %}
Chaque région ajoute des déploiements à mesure que la capacité disponible passe sous un seuil.

<pre class="language-json" data-title=""><code class="lang-json">{
<strong>  "name": "sb-mmo-chicago",
</strong><strong>  <a data-footnote-ref href="#user-content-fn-18">"filter"</a>: "total_joinable_seats gt 5 and metadata.policy_name eq 'sb-mmo-chicago'",
</strong>  "deployment_request": {
<strong>    <a data-footnote-ref href="#user-content-fn-19">"private_host_ids"</a>: ["alpha-north-america-95fab093"],
</strong>    "application": <a data-footnote-ref href="#user-content-fn-13">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-14">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-15">user_data</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-mmo-chicago"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_SCALING_POLICY_NAME",
</strong><strong>        "value": "sb-mmo-chicago",
</strong>        "is_hidden": false
      }
    ],
<strong>    <a data-footnote-ref href="#user-content-fn-20">"webhook_on_terminated"</a>: {
</strong>      "url": "https://my-webhook.com"
    }
  },
<strong>  "minimum_active_instances": 3
</strong>}
</code></pre>

{% endtab %}

{% tab title="🔑 Communauté" %}
Une politique par propriétaire de serveur, en transmettant un mot de passe personnalisé utilisé pour l'authentification du serveur.

<pre class="language-json" data-title=""><code class="lang-json">{
<strong>  "name": "sb-owner-jnjnc8mid",
</strong><strong>  <a data-footnote-ref href="#user-content-fn-21">"filter"</a>: "metadata.policy_name eq 'sb-owner-jnjnc8mid'",
</strong>  "deployment_request": {
<strong>    <a data-footnote-ref href="#user-content-fn-19">"private_host_ids"</a>: ["alpha-north-america-95fab093"],
</strong>    "application": <a data-footnote-ref href="#user-content-fn-13">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-14">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-15">user_data</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["community", "sb-owner-jnjnc8mid"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_SCALING_POLICY_NAME",
</strong><strong>        "value": "sb-owner-jnjnc8mid",
</strong>        "is_hidden": false
      },
      {
<strong>        "key": "SB_SERVER_PASSWORD",
</strong><strong>        "value": "password1234",
</strong>        "is_hidden": false
      }
    ],
<strong>    <a data-footnote-ref href="#user-content-fn-22">"webhook_on_ready"</a>: {
</strong>      "url": "https://my-webhook.com"
    },
<strong>    <a data-footnote-ref href="#user-content-fn-23">"webhook_on_error"</a>: {
</strong>      "url": "https://my-webhook.com"
    },
<strong>    <a data-footnote-ref href="#user-content-fn-20">"webhook_on_terminated"</a>: {
</strong>      "url": "https://my-webhook.com"
    }
  },
  "minimum_active_instances": 1
}
</code></pre>

{% endtab %}

{% tab title="❄️ Groupe maillé" %}
Une politique par groupe de serveurs. Le backend du jeu lance un nœud principal, qui génère des répliques. Chaque nœud lit l'ID du groupe maillé injecté et recherche les autres nœuds avec lesquels se connecter.

<pre class="language-json" data-title=""><code class="lang-json">{
<strong>  "name": "sb-meshgroup-pqyt8sxcb",
</strong><strong>  <a data-footnote-ref href="#user-content-fn-12">"filter"</a>: "metadata.policy_name eq 'sb-meshgroup-pqyt8sxcb'",
</strong>  "deployment_request": {
    "private_host_ids": [],
    "application": <a data-footnote-ref href="#user-content-fn-13">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-14">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-15">user_data</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-meshgroup-pqyt8sxcb"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_SCALING_POLICY_NAME",
</strong><strong>        "value": "sb-meshgroup-pqyt8sxcb",
</strong>        "is_hidden": false
      },
      {
<strong>        "key": "SB_MESH_GROUP_ID",
</strong><strong>        "value": "pqyt8sxcb",
</strong>        "is_hidden": false
      }
    ],
<strong>    <a data-footnote-ref href="#user-content-fn-22">"webhook_on_ready"</a>: {
</strong>      "url": "https://my-webhook.com"
    },
<strong>    <a data-footnote-ref href="#user-content-fn-24">"webhook_on_terminated"</a>: {
</strong>      "url": "https://my-webhook.com"
    }
  },
<strong>  <a data-footnote-ref href="#user-content-fn-25">"minimum_active_instances"</a>: 9
</strong>}
</code></pre>

{% endtab %}
{% endtabs %}

## ⚙️ Configuration

L'API Server Browser est générée à partir d'une configuration JSON spécifiée lorsque vous créez un nouveau Server Browser (ou en redémarrage rapide). Vous pouvez définir l'expiration des serveurs et des emplacements, ainsi que des métadonnées personnalisées :

{% tabs %}
{% tab title="🍀 Exemple simple" %}

<pre class="language-json" data-title="sb-simple-example-v1-0-1.json"><code class="lang-json">{
	"version": "1.0.1",
	"server_instances": {
		"expiration_period": "1m",
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"policy_name": "string",
			"name": "string"
		}
	},
	"server_instance_slots": {
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {}
	},
	"seat_reservations": {
		"expiration_period": "30s"
	},
	"scaling_policies": {
		"monitoring_interval": "10s",
		"deployment_registration_period": "1m"
	},
  "rate_limits": {
    "per_client_ip": 5
  }
}
</code></pre>

{% endtab %}

{% tab title="🎈 Jeux sociaux" %}

<pre class="language-json" data-title="sb-social-example-v1-0-1.json"><code class="lang-json">{
	"version": "1.0.1",
	"server_instances": {
		"expiration_period": "15s",
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"policy_name": "string",
			"name": "string",
			"third_party_id": "string",
			"level": "string",
			"mode": "string",
			"difficulty": "string",
			"seed": "string",
			"max_players": "int",
			"app_version": "string",
			"location.city": "string"
		}
	},
	"server_instance_slots": {
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"third_party_id": "string",
			"max_players": "int",
			"avg_latency": "int",
			"player_ids": "string"
		}
	},
	"seat_reservations": {
		"expiration_period": "30s"
	},
	"scaling_policies": {
		"monitoring_interval": "10s",
		"deployment_registration_period": "30s"
	},
  "rate_limits": {
    "per_client_ip": 5
  }
}
</code></pre>

{% endtab %}

{% tab title="🤝 Jeux coopératifs" %}

<pre class="language-json" data-title="sb-cooperative-example-v1-0-1.json"><code class="lang-json">{
	"version": "1.0.1",
	"server_instances": {
		"expiration_period": "15s",
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"policy_name": "string",
			"name": "string",
			"third_party_id": "string",
			"level": "string",
			"mode": "string",
			"difficulty": "string",
			"avg_rank": "int",
			"max_players": "int",
			"app_version": "string",
			"tags": "string",
			"match_id": "string",
			"location.city": "string"
		}
	},
	"server_instance_slots": {
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"third_party_id": "string",
			"max_players": "int",
			"player_ids": "string"
		}
	},
	"seat_reservations": {
		"expiration_period": "30s"
	},
	"scaling_policies": {
		"monitoring_interval": "10s",
		"deployment_registration_period": "30s"
	},
  "rate_limits": {
    "per_client_ip": 5
  }
}
</code></pre>

{% endtab %}

{% tab title="⚔️ Jeux compétitifs" %}

<pre class="language-json" data-title="sb-competitive-example-v1-0-1.json"><code class="lang-json">{
	"version": "1.0.1",
	"server_instances": {
		"expiration_period": "15s",
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"policy_name": "string",
			"name": "string",
			"third_party_id": "string",
			"avg_rank": "int",
			"max_players": "int",
			"is_ranked": "bool",
			"app_version": "string",
			"cpu_frequency": "int",
			"match_id": "string",
			"location.city": "string"
		}
	},
	"server_instance_slots": {
		"<a data-footnote-ref href="#user-content-fn-26">index</a>": {
			"third_party_id": "string",
			"max_players": "int",
			"avg_rank": "int",
			"avg_latency": "int"
		}
	},
	"seat_reservations": {
		"expiration_period": "30s"
	},
	"scaling_policies": {
		"monitoring_interval": "10s",
		"deployment_registration_period": "15s"
	},
  "rate_limits": {
    "per_client_ip": 5
  }
}
</code></pre>

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Pour de meilleures performances, évitez de spécifier des index pour les métadonnées qui ne sont pas utilisées pour le filtrage ou le tri. Les paramètres non indexés peuvent néanmoins être définis et lus avec les méthodes API de détails de l'instance de serveur ou du slot, voir [#api](#api "mention").
{% endhint %}

## ☁️ Cluster d'hébergement

Server Browser est hébergé et géré 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 pour bénéficier d'un hébergement hautement disponible, maintenu par l'équipe Edgegap, avec une assistance en direct 24 h/24, 7 j/7 pour les jeux publiés au public.

Les besoins en ressources de votre instance dépendront de facteurs :

* **nombre de joueurs** - plus de joueurs entraînent plus de requêtes API,
* **nombre de requêtes par joueur** - des tentatives plus rapides augmentent la charge du service et consomment des ressources,
* **nombre de serveurs** - plus de serveurs entraînent plus de données stockées et plus de requêtes API,
* **logique de repli des nouvelles tentatives du client** - les nouvelles tentatives avec backoff à jitter aident à répartir les pics de trafic,
* **durée moyenne des matchs** - des sessions plus courtes nécessitent une interaction plus fréquente avec le Server Browser.

{% 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 %}

## 📗 API

**Envisagez d'utiliser notre SDK pour** [**Unreal Engine**](/fr/unreal-engine/developer-tools.md) **ou** [**Unity**](/fr/unity/navigateur-de-serveurs.md) **pour démarrer rapidement avec des exemples préconstruits.**

Les clients de jeu et les serveurs dédiés envoient des requêtes API tout au long de leur cycle de vie vers Server Browser.

{% 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 %}

{% file src="/files/0fce12b37adb35699c68e3e0f5ee8cbc7d4a6d0e" %}

Importer la spécification de l'API dans [Scalar API Web Client](https://client.scalar.com/workspace/default/request/default) ou [Swagger Editor](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 rafale et les plantages, nous limitons le nombre de requêtes client par seconde, par adresse IP publique du client.

La limite est configurée par [#configuration](#configuration "mention") paramètre `rate_limits.per_client_ip`.

{% hint style="warning" %}
Si vos clients de jeu ne réessaient pas les requêtes lors de la réception de la réponse `429 Trop de requêtes` **certains joueurs pourraient ne pas être en mesure de rejoindre les serveurs** pendant de courtes rafales et les périodes de trafic de pointe.
{% endhint %}

{% hint style="success" %}
**Nous recommandons de tester le comportement de l'application avec des limites de débit plus faibles pendant le développement (1 requête/s).**
{% 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 client atteint la limite de débit par IP configurée, il reçoit une `429 Trop de requêtes`  réponse et est censé réessayer avec un délai de retour croissant.

Si les politiques de mise à l'échelle déclencheraient davantage de déploiements que la limite req/s autorisée de votre organisation, votre Server Browser réessaiera automatiquement à chaque intervalle de surveillance, en utilisant une stratégie de round-robin pondérée basée sur la quantité de déploiements prévus, en essayant de répartir la quota de déploiement disponible de manière uniforme entre toutes les politiques de mise à l'échelle.

### Pagination

**Server Browser fournit une pagination par curseur pour récupérer progressivement les données filtrées dans un ordre spécifique.** Cette approche nécessite d'envoyer un curseur (point de départ) et une taille de page (nombre d'éléments de réponse) à chaque récupération de résultats supplémentaires, contrairement à la pagination classique par limite et décalage.

{% hint style="info" %}
Associée à notre système propriétaire d'indexation de base de données développé pour les métadonnées des serveurs de jeu, la pagination par curseur offre une expérience utilisateur rapide, cohérente et flexible pour filtrer des données hautement dynamiques.
{% endhint %}

Notre objectif est que les utilisateurs trouvent un serveur adapté dès la première page. Pour une meilleure expérience, nous recommandons d'afficher les résultats mis en cache des pages précédentes et de ne rafraîchir les résultats que lorsque l'utilisateur clique sur Rechercher.

## 🔖 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**.

{% hint style="info" %}
**La dernière version de Server Browser est `1.0.0`** . Gardez un œil sur les [mises à jour et annonces](/fr/docs/release-notes.md).
{% endhint %}

[^1]: identifiants de joueurs tiers

[^2]: valeur d'exemple

[^3]: égal à

[^4]: différent de

[^5]: inférieur à

[^6]: inférieur ou égal à

[^7]: supérieur à

[^8]: supérieur ou égal à

[^9]: voir la configuration

[^10]: voir les politiques d'exemple

[^11]: utilisez la mise en cache active pour réduire facilement les temps de déploiement

[^12]: * capacité fixe
    * suppose que les instances fournissent le nom de la politique dans les métadonnées à partir de la variable injectée

[^13]: remplacez par votre propre nom d'application

[^14]: remplacez par votre propre version d'application

[^15]: coordonnées de Chicago

[^16]: * déploie lorsqu'on trouve moins de 10 instances joignables
    * suppose que les instances fournissent le nom de la politique dans les métadonnées à partir de la variable injectée

[^17]: nous prévoyons au moins 10 déploiements dans la région de Chicago

[^18]: * déploie lorsqu'on trouve moins de 3 instances avec 5 sièges joignables ou moins
    * suppose que les instances fournissent le nom de la politique dans les métadonnées à partir de la variable injectée

[^19]: privilégier la flotte privée si la capacité est disponible

[^20]: notifier le backend du jeu lorsque le serveur redémarre

[^21]: * ne surveille pas la capacité
    * suppose que les instances fournissent le nom de la politique dans les métadonnées à partir de la variable injectée

[^22]: notifier le backend du jeu lorsque c'est prêt

[^23]: notifier le backend du jeu lorsque le déploiement échoue

[^24]: notifier le backend du jeu lorsqu'il est arrêté

[^25]: grille 3x3 = 9 serveurs par monde

[^26]: les index contiennent vos paramètres de métadonnées personnalisés utilisés pour le filtrage ou le tri
