# Server Browser

Commencez rapidement avec Server Browser et explorez des scénarios d’exemple pour différents genres.

Server Browser est un service géré pour [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md#match-bound) et [Persistants](/docs.edgegap.com-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 du jeu ;
* **pré-réchauffer de nouveaux serveurs** pour servir des publics mondiaux à grande échelle et éviter des files d’attente frustrantes ;
* **simplifier les opérations des serveurs** y compris les mises à jour, les redémarrages, la persistance, le meshing et plus encore.

{% hint style="success" %}
Vous cherchez à mettre les joueurs en relation selon des règles strictes, sans permettre le choix du serveur ? Pensez à [Matchmaking](/docs.edgegap.com-fr/learn/matchmaking.md).
{% endhint %}

## ✔️ Préparation

### 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, afficher 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 pour 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 du préchauffage ou une 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 mise en production, **votre navigateur de serveurs devra fonctionner 24 h/24 et 7 j/7** pour garantir que les joueurs du monde entier puissent rejoindre les serveurs.
{% endhint %}

## ▶️ Commencer à naviguer

Découvrez le cycle de vie des serveurs/joueurs et leurs responsabilités afin de garantir une utilisation efficace des serveurs.

### Authentifier

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

* **Jeton de serveur** - requis pour [API du serveur](#server-lifecycle) méthodes, peut être [injecté en tant que variable de version de l’application](/docs.edgegap.com-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 une instance

{% hint style="warning" %}
**Nouveau** [Déploiements](/docs.edgegap.com-fr/learn/orchestration/deployments.md) **doit créer une nouvelle instance** lors de l’initialisation afin de 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 emplacement défini lors de l’initialisation de l’instance,
* les détails de connexion du serveur — URL, IP, informations de port et emplacement.

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

* informations sur les emplacements — capacité d’équipe et métadonnées spécifiques à l’équipe (p. ex. nom de l’équipe),
* nom et tags — libellés personnalisables, uniques, lisibles par l’humain et recherchables ;
* données de compatibilité — version du serveur ou versions client prises en charge ;
* qualificateurs de latence — identifiants de ville et de région, et [Balises Ping](/docs.edgegap.com-fr/learn/orchestration/ping-beacons.md) détails ;
* paramètres du 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é sous la forme `"object.child.property"`.
{% endhint %}

Les serveurs peuvent **mettre à jour les métadonnées de l’instance ou de l’emplacement à 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 n’ont pas été modifiées).

**Les instances de serveur doivent envoyer périodiquement un battement de cœur 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 battement de cœur 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](/docs.edgegap.com-fr/learn/orchestration/persistance.md) pour gérer l’état persistant du monde et [Applications et versions](/docs.edgegap.com-fr/learn/orchestration/application-and-versions.md#active-caching) pour des déploiements plus rapides.
{% endhint %}

### Allouer de la capacité

La capacité de l’instance et des emplacements 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 lancé avec une politique de mise à l’échelle spécifique,
* [#search-and-browse](#search-and-browse "mention") pour permettre au joueur de définir des filtres et de parcourir les serveurs adaptés parmi lesquels choisir.

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

#### Réservation auto-assigné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-assignée, en ne fournissant que les ID des joueurs et le nom d’une politique de mise à l’échelle. Server Browser trouvera automatiquement une instance avec un emplacement offrant une capacité joignable suffisante et réservera des places, en répondant immédiatement avec les détails de connexion de l’instance.

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

* **le code d’état indique si la politique est en train de monter en capacité** et si davantage de capacité sera ajoutée,
* **en-tête `Retry-After`  indique la période d’attente (en secondes) avant de réessayer**, si la demande peut être retentée.

Une fois la 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 des instances de serveur et [paginer dans les résultats](#pagination) pour trouver un serveur qu’ils souhaitent rejoindre.

Les instances et les emplacements peuvent être filtrés et triés à l’aide de paramètres intégrés ou [de 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">Emplacement</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-2"><code>eq</code></a>  ou <a data-footnote-ref href="#user-content-fn-3"><code>ne</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-4"><code>lt</code></a>  ou <a data-footnote-ref href="#user-content-fn-5"><code>le</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-6"><code>gt</code></a>  ou <a data-footnote-ref href="#user-content-fn-7"><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-2"><code>eq</code></a>  ou <a data-footnote-ref href="#user-content-fn-3"><code>ne</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-4"><code>lt</code></a>  ou <a data-footnote-ref href="#user-content-fn-5"><code>le</code></a> ou </p><p><a data-footnote-ref href="#user-content-fn-6"><code>gt</code></a>  ou <a data-footnote-ref href="#user-content-fn-7"><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-2"><code>eq</code></a>  ou <a data-footnote-ref href="#user-content-fn-3"><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 métadonnées de régions et/ou de villes pour restreindre la sélection avant de mesurer la latence vers les serveurs.
{% endhint %}

{% hint style="info" %}
Découvrez la [#pagination](#pagination "mention") à base de curseur pour permettre aux utilisateurs d’obtenir plus de résultats.
{% endhint %}

#### Réserver des places

Avant de rejoindre un serveur, une réservation de place est requise pour s’assurer que l’instance offre une capacité disponible suffisante. Les réservations peuvent inclure un groupe de joueurs ou une seule personne.

Identité fédérée : les joueurs doivent fournir un identifiant 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 la réservation effectuée avec succès ([200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200)) les joueurs doivent tenter la connexion immédiatement. Les réservations en attente **expirent après 30 secondes (configurable) sauf confirmation** par votre serveur.

**Les réservations dépassant la capacité de places joignables de l’emplacement 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 emplacement, en ajouter, en supprimer ou en mettre à jour. **Toutes les réservations pour un emplacement donné seront supprimées si des réservations en attente dépassent la nouvelle capacité disponible de l’emplacement.**
{% 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 depuis** (URL ou IP, [Port externe](/docs.edgegap.com-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 tapez `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](/docs.edgegap.com-fr/unreal-engine.md#troubleshooting-and-faq-1).
{% endhint %}
{% endtab %}

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

* **Déploiement** **URL** pointant vers l’IP du serveur, généralement dans le composant `NetworkManager`  .
* **Port externe** mappé au [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’expiration 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 %}

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

* affectation des réservations de joueurs acceptées à leur emplacement préféré,
* affectation des réservations de joueurs expirées à leur emplacement préféré,
* une liste d’identifiants de joueurs inconnus.

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

### Abandonner le serveur

Lorsque les joueurs quittent, votre serveur doit augmenter la capacité de places disponibles pour l’emplacement attribué.

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

Lisez à propos de [Persistance](/docs.edgegap.com-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 de mise à l’échelle automatique :

* **méthode de préchauffage** - démarrer les serveurs strictement avec les politiques de mise à l’échelle de Server Browser,
* **méthode juste-à-temps** - démarrer via [Matchmaking](/docs.edgegap.com-fr/learn/matchmaking.md) et [remplir avec Server Browser](#allocate-capacity),
* **autoscaler personnalisé** - démarrer via un backend de jeu personnalisé et [remplir 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" %}
Découvrez comment arrêter les déploiements dans [Unreal Engine](/docs.edgegap.com-fr/unreal-engine.md#stop-deployments), [Unity](/docs.edgegap.com-fr/unity.md#stop-deployments), ou [avec l’API](/docs.edgegap.com-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 chaque [`monitoring_interval`](#user-content-fn-8)[^8] . Chaque politique nécessite un filtre utilisant la même [syntaxe de filtrage](#search-and-browse) que celle utilisée par les joueurs lors de la recherche d’instances — par région, capacité ou autres critères.

Votre [`minimum_active_instances`](#user-content-fn-9)[^9]  quantité configurée peut être considérée soit comme une :

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

#### Capacité fixe

Conservez une quantité fixe de serveurs actifs pour les jeux avec [Persistance](/docs.edgegap.com-fr/learn/orchestration/persistance.md), particulièrement lorsque ces jeux offrent aux joueurs la possibilité de provisionner [Persistance](/docs.edgegap.com-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 d’éditeurs 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 en panne à la volée.
{% endhint %}

#### Veille de préchauffage

Lancez des serveurs avant la demande des joueurs si :

* vous lancez une grande sortie et prévoyez un afflux rapide de joueurs sur une courte période,
* ou si l’initialisation du serveur nécessite plus de 30 secondes ([sans inclure le temps de déploiement](#user-content-fn-10)[^10]),
* ou si le jeu met en œuvre des stratégies de meshing nécessitant des dépendances réseau en couches ou circulaires.

### Déployer des serveurs

De nouveaux déploiements seront lancés automatiquement lorsque le nombre d’instances de serveur surveillées*s* tombe en dessous du minimum configuré d’instances actives. Tous les déploiements sont demandés immédiatement et retentés indéfiniment à chaque intervalle de surveillance après que [`deployment_registration_period`](#user-content-fn-8)[^8]  se soit é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, ou **votre politique peut boucler indéfiniment et créer un grand nombre de déploiements inutilisés**!&#x20;
{% endhint %}

Les politiques lancent des déploiements avec [Flottes privées](/docs.edgegap.com-fr/learn/orchestration/flottes-privees.md) (avec Overflow to Cloud) ou directement vers le Cloud.

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

* [**application et version**](/docs.edgegap.com-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 le [placement du serveur](/docs.edgegap.com-fr/learn/orchestration/deployments.md#regional-standby),
* [**identifiants d’hôtes privés**](/docs.edgegap.com-fr/learn/orchestration/flottes-privees.md) - laissez vide pour le cloud, ou spécifiez des hôtes dans la région souhaitée,
* [**tags**](/docs.edgegap.com-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**](/docs.edgegap.com-fr/learn/orchestration/deployments.md#custom-variables) - transmettez des paramètres personnalisés et des secrets aux serveurs,
* [**webhooks**](/docs.edgegap.com-fr/learn/orchestration/deployments.md#webhooks-and-postbacks) - informez votre backend de jeu (ou matchmaker) des événements du cycle de vie du déploiement,
* [**exiger des emplacements mis en cache**](/docs.edgegap.com-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 l’une de ces politiques selon vos besoins. La plupart des jeux utiliseront plusieurs politiques.

{% tabs %}
{% tab title="🍀 Pool QA" %}
Une politique simple pour maintenir 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-11">"filter"</a>: "metadata.policy_name eq 'sb-qa-pool'",
</strong>  "deployment_request": {
    "private_host_ids": [],
    "application": <a data-footnote-ref href="#user-content-fn-12">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-13">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-14">données utilisateur</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-qa-pool"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_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 des déploiements 10x avant la sortie 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-15">"filter"</a>: "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-12">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-13">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-14">données utilisateur</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-v1.0.0-chicago"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_POLICY_NAME",
</strong><strong>        "value": "sb-v1.0.0-chicago",
</strong>        "is_hidden": false
      }
    ]
  },
<strong>  <a data-footnote-ref href="#user-content-fn-16">"minimum_active_instances"</a>: 10
</strong>}
</code></pre>

{% endtab %}

{% tab title="🔒 MMO" %}
Chaque région ajoute des déploiements lorsque 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-17">"filter"</a>: "joinable_seats gt 5 and metadata.policy_name eq 'sb-mmo-chicago'",
</strong>  "deployment_request": {
<strong>    <a data-footnote-ref href="#user-content-fn-18">"private_host_ids"</a>:["alpha-north-america-95fab093"],
</strong>    "application": <a data-footnote-ref href="#user-content-fn-12">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-13">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-14">données utilisateur</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-mmo-chicago"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_POLICY_NAME",
</strong><strong>        "value": "sb-mmo-chicago",
</strong>        "is_hidden": false
      }
    ],
<strong>    <a data-footnote-ref href="#user-content-fn-19">"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-20">"filter"</a>: "metadata.policy_name eq 'sb-owner-jnjnc8mid'",
</strong>  "deployment_request": {
<strong>    <a data-footnote-ref href="#user-content-fn-18">"private_host_ids"</a>:["alpha-north-america-95fab093"],
</strong>    "application": <a data-footnote-ref href="#user-content-fn-12">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-13">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-14">données utilisateur</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["community", "sb-owner-jnjnc8mid"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_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-21">"webhook_on_ready"</a>: {
</strong>      "url": "https://my-webhook.com"
    },
<strong>    <a data-footnote-ref href="#user-content-fn-22">"webhook_on_error"</a>: {
</strong>      "url": "https://my-webhook.com"
    },
<strong>    <a data-footnote-ref href="#user-content-fn-19">"webhook_on_terminated"</a>: {
</strong>      "url": "https://my-webhook.com"
    }
  },
  "minimum_active_instances": 1
}
</code></pre>

{% endtab %}

{% tab title="❄️ Groupe Mesh" %}
Une politique par groupe de serveurs. Le backend du jeu démarre un nœud principal, qui crée des réplicas. Chaque nœud lit l’ID de groupe mesh injecté et recherche les autres nœuds avec lesquels se mettre en réseau.

<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-11">"filter"</a>: "metadata.policy_name eq 'sb-meshgroup-pqyt8sxcb'",
</strong>  "deployment_request": {
    "private_host_ids": [],
    "application": <a data-footnote-ref href="#user-content-fn-12">"my-game-server"</a>,
    "version": <a data-footnote-ref href="#user-content-fn-13">"2024.01.30-16.23.00-UTC"</a>,
    "users": [
      {
        "user_type": "geo_coordinates",
        "<a data-footnote-ref href="#user-content-fn-14">données utilisateur</a>": {
<strong>          "latitude": 41.881832,
</strong><strong>          "longitude": -87.623177
</strong>        }
      }
    ],
<strong>    "tags": ["sb-meshgroup-pqyt8sxcb"],
</strong>    "environment_variables": [
      {
<strong>        "key": "SB_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-21">"webhook_on_ready"</a>: {
</strong>      "url": "https://my-webhook.com"
    },
<strong>    <a data-footnote-ref href="#user-content-fn-23">"webhook_on_terminated"</a>: {
</strong>      "url": "https://my-webhook.com"
    }
  },
<strong>  <a data-footnote-ref href="#user-content-fn-24">"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 un redémarrage rapide). Vous pouvez spécifier l’expiration du serveur 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-0.json"><code class="lang-json">{
	"version": "1.0.0",
	"server_instances": {
		"expiration_period": "1m",
		"<a data-footnote-ref href="#user-content-fn-25">indices</a>": {
			"policy_name": "string",
			"name": "string"
		}
	},
	"server_instance_slots": {
		"<a data-footnote-ref href="#user-content-fn-25">indices</a>": {}
	},
	"seat_reservations": {
		"expiration_period": "30s"
	},
	"scaling_policies": {
		"monitoring_interval": "10s",
		"deployment_registration_period": "1m"
	}
}
</code></pre>

{% endtab %}

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

<pre class="language-json" data-title="sb-social-example-v1-0-0.json"><code class="lang-json">{
	"version": "1.0.0",
	"server_instances": {
		"expiration_period": "15s",
		"<a data-footnote-ref href="#user-content-fn-25">indices</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-25">indices</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"
	}
}
</code></pre>

{% endtab %}

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

<pre class="language-json" data-title="sb-cooperative-example-v1-0-0.json"><code class="lang-json">{
	"version": "1.0.0",
	"server_instances": {
		"expiration_period": "15s",
		"<a data-footnote-ref href="#user-content-fn-25">indices</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-25">indices</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"
	}
}
</code></pre>

{% endtab %}

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

<pre class="language-json" data-title="sb-competitive-example-v1-0-0.json"><code class="lang-json">{
	"version": "1.0.0",
	"server_instances": {
		"expiration_period": "15s",
		"<a data-footnote-ref href="#user-content-fn-25">indices</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-25">indices</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"
	}
}
</code></pre>

{% endtab %}
{% endtabs %}

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

## ☁️ Cluster d’hébergement

Server Browser est hébergé et géré 24 h/24 et 7 j/7 par Edgegap.

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

### Niveaux de cluster privé

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 et 7 j/7 pour les jeux publiés publiquement.

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

* **nombre de joueurs** - davantage de joueurs entraîne davantage 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 il y a de serveurs, plus les données stockées et les requêtes API sont nombreuses,
* **logique de repli de nouvelle tentative du client** - réessayer avec un backoff avec jitter aide à répartir les pics de trafic,
* **durée moyenne d'une partie** - des sessions plus courtes nécessitent des interactions plus fréquentes avec le navigateur de serveurs.

## 📗 API

**Envisagez d'utiliser notre SDK pour** [**Unreal Engine**](/docs.edgegap.com-fr/unreal-engine/developer-tools.md) **ou** [**Unity**](/docs.edgegap.com-fr/unity/server-browser.md) **pour démarrer rapidement avec des exemples préconçus.**

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

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

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.

### Pagination

**Le Navigateur de serveurs fournit une pagination par curseur pour récupérer progressivement des 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 fois que l'on récupère davantage de résultats, contrairement à la pagination traditionnelle 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 مناسب dès la première page. Pour une meilleure expérience, nous recommandons d'afficher les résultats mis en cache pour les pages précédentes, et de ne rafraîchir les résultats que lorsque l'utilisateur clique sur Rechercher.

## 🔖 Journal des modifications

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

[^1]: identifiants tiers de joueur

[^2]: égal à

[^3]: différent de

[^4]: inférieur à

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

[^6]: supérieur à

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

[^8]: voir Configuration

[^9]: voir Politiques d’exemple

[^10]: utilisez le cache actif pour réduire facilement les temps de déploiement

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

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

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

[^14]: coordonnées de Chicago

[^15]: * 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 d’une variable injectée

[^16]: nous nous attendons à au moins 10 déploiements dans la région de Chicago

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

[^18]: préférer une flotte privée si la capacité est disponible

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

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

[^21]: notifier le backend du jeu lorsque prêt

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

[^23]: notifier le backend du jeu lorsqu’arrêté

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/docs.edgegap.com-fr/learn/server-browser.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
