# Persistance

Apprenez à gérer des mondes persistants avec des déploiements toujours en ligne 24/7 sur [flottes-privees](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/flottes-privees "mention").

De nombreux genres (MMO, Sandbox, jeux sociaux) tirent parti des mondes persistants pour permettre aux joueurs :

* de se rencontrer et de socialiser avec de nouveaux amis ; de favoriser des communautés de joueurs organiques,
* d'explorer un monde ouvert vivant rempli de contenus générés par les utilisateurs placés par les joueurs,
* de participer à des raids épiques durant des heures avec de grands groupes ou des guildes entières.

Explorez des stratégies pour **offrir la meilleure expérience joueur possible, garder les coûts sous contrôle et éliminer la frustration des joueurs due aux pannes ou aux retours en arrière**. Améliorez le modèle de serveur traditionnel en apportant les avantages de l'edge computing conditionnés pour une utilisation facile par les développeurs de jeux.

## ✔️ Préparation

Pour permettre des déploiements persistants et ininterrompus 24/7 :

* [créez une nouvelle version d'application (ou mettez à jour une version existante) avec notre API](https://docs.edgegap.com/docs.edgegap.com-fr/docs/api/gestion-des-versions#post-v1-app-app_name-version),
  * spécifiez `"max_duration": -1`  pour éviter la terminaison automatique après 24 h,
* Utilisez [API de déploiement de flotte privée](https://docs.edgegap.com/docs.edgegap.com-fr/docs/api/serveurs-dedies#post-private-fleets-deploy) pour démarrer [serveurs en attente](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#regional-standby) par [persistance](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/persistance "mention").
  * Choisissez entre des Machines Virtuelles (Performance) ou des spécifications Bare Metal (Overdrive).

{% hint style="warning" %}
**Testez la montée en charge de votre serveur et** [**le processus de terminaison**](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#id-5.-deployment-stopped) **pour vérifier la fiabilité de vos contrôles de coûts. L'état du serveur stocké en mémoire sera perdu une fois le déploiement arrêté, voir** [#configuration-and-state](#configuration-and-state "mention").
{% endhint %}

## 🔑 Propriété du serveur

Explorez les avantages et inconvénients des modèles de propriété modernes et traditionnels avec une touche d'edge computing.

### Hébergement par le studio

L'hébergement des serveurs est traditionnellement géré par le studio, qui couvre le coût de l'hébergement à partir des revenus du jeu.

👍 **Avantages**

* tarification produit transparente - le coût de l'hébergement est couvert par la licence/abonnement du joueur,
* forte compatibilité client/serveur avec découplage souple des clients, services et montée en charge,
* plus résistant à la triche et au reverse engineering en raison de la nature propriétaire des serveurs.

👎 **Inconvénients**

* le support du modding par la communauté est limité pour garantir l'intégrité et la stabilité du serveur.

### Serveurs communautaires

Permettez à vos joueurs d'héberger et de financer leurs propres serveurs et éliminez le besoin de services de location tiers. Canalisez les revenus via votre studio plutôt que par des tiers qui n'ont pas de visibilité sur la qualité de l'expérience utilisateur finale.

👍 **Avantages**

* support de modding amélioré via une liste sélectionnée de mods [application-and-versions](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/application-and-versions "mention"),
* boucle de retour joueur améliorée grâce à une collaboration plus étroite avec la communauté,
* risque financier réduit car les joueurs couvrent le coût de l'hébergement.

👎 **Inconvénients**

* plus d'opérations pour le studio - modération des demandes des joueurs et collecte des paiements,
* compatibilité client/serveur plus faible en raison du nombre accru de versions moddées,
* susceptible aux tricheurs en raison d'une base de code distribuée et de la possibilité de reverse engineering.

## 🥛 Capacité & Mise à l'échelle

Apprenez des techniques avancées pour optimiser la disponibilité des serveurs, le coût d'hébergement et la qualité de service.

### Capacité

**Les déploiements ne suivent ni ne gèrent les connexions actives des joueurs** après vous [#id-1.-start-a-deployment](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#id-1.-start-a-deployment "mention") pour vous donner un contrôle absolu et la liberté d'implémenter n'importe quel design.

Mettez en œuvre la gestion de la capacité pour garantir que vos serveurs :

* maximisent les économies de coûts - [benchmarquent](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#container-metrics) et utilisent efficacement les ressources serveur,
* offrent un gameplay fluide - empêchent la surcharge des serveurs par trop de joueurs simultanés,
* éviter les mauvaises critiques dues aux plantages - intercepter et gérer les exceptions inattendues.

Pour garantir une gestion efficace de la capacité des serveurs :

* libérez des emplacements joueurs si [des joueurs assignés au serveur de jeu](https://docs.edgegap.com/docs.edgegap.com-fr/appariement/matchmaker-in-depth#player-tickets) ne se connectent pas dans quelques secondes,
* envoyez fréquemment un message de heartbeat minimal des clients vers le serveur pour suivre l'activité,
* déconnectez les clients et libérez les emplacements joueurs si aucune activité n'est détectée pendant plusieurs secondes,
* empêchez l'ajout de joueurs sur des serveurs à pleine capacité sans emplacements disponibles.

{% hint style="success" %}
Voir [Broken link](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/broken-reference "mention") pour la gestion automatisée de la capacité avec notre service géré.
{% endhint %}

### Monter en charge

**La mise à l'échelle des serveurs persistants ne nécessite pas de « deviner »** le trafic régional ou le coût serveur. Réservez [flottes-privees](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/flottes-privees "mention") capacité pour [la marée basse](#user-content-fn-1)[^1] et débordez automatiquement vers le cloud lors de pics inattendus.

Mettez en œuvre des stratégies de mise à l'échelle des serveurs pour :

* permettre un hébergement à grande échelle tout en protégeant soigneusement contre les abus,
* minimiser le gaspillage de coûts serveur dû aux serveurs en veille vides,
* éviter les longues files d'attente en répondant rapidement à l'augmentation de la demande des joueurs.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FWVZEdEvyAcAROhqNYbKQ%2Fimage.png?alt=media&#x26;token=a26d6f3a-9071-41aa-b27f-ee96555f84a9" alt=""><figcaption><p>Architecture de référence pour l'auto-scaling</p></figcaption></figure>

#### Points clés d'intégration

1. Les clients intègrent une Autorité d'Échelle - [appariement](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement "mention"), [server-browser](https://docs.edgegap.com/docs.edgegap.com-fr/learn/server-browser "mention"), ou une solution personnalisée.
   1. Découvrez d'autres joueurs, réservez de la capacité dans des serveurs en cours d'exécution, ou demandez de nouveaux serveurs si nécessaire.
2. L'Autorité d'Échelle assigne des serveurs en cours d'exécution ou lance de nouveaux serveurs pour desservir les joueurs.
3. Le serveur informe l'Autorité d'Échelle en temps réel du démarrage/arrêt du serveur et des changements de connexion des joueurs.
   1. L'Autorité d'Échelle supprime (expire) les enregistrements obsolètes des serveurs non réactifs (plantés).
4. Les clients se connectent et établissent des sessions de jeu directement avec le serveur, puis passent au jeu.

**Nous recommandons fortement une mise à l'échelle basée sur le nombre de connexions plutôt que la charge physique** (CPU & RAM), car les fluctuations momentanées de la charge physique peuvent entraîner une disponibilité imprévisible.

### Redescendre en charge

Des politiques de réduction efficaces sont essentielles pour optimiser les coûts, mais [arrêter des serveurs](https://docs.edgegap.com/docs.edgegap.com-fr/docs/api/serveurs-dedies#v1-self-stop-request_id-access_point_id) sans précaution peut affecter négativement l'expérience des joueurs. **Considérez ces facteurs et testez les changements avant de les déployer :**

**Votre détection de l'activité / déconnexion des joueurs est-elle fiable ?**

* L'absence d'entrée indique-t-elle de façon fiable une inactivité du joueur ? Les joueurs utilisent souvent des bots, macros et autres techniques pour simuler de l'activité et maintenir une connexion active afin d'éviter les temps d'attente.
* Y a-t-il des actions fréquemment effectuées par des joueurs actifs qui sont difficiles à simuler ?
* L'utilisation de bots ou de macros est-elle un problème ou une fonctionnalité avec [#studio-hosting](#studio-hosting "mention") les serveurs ?

**L'arrêt des serveurs est-il facilement et rapidement réversible (remonter en charge) ?**

* Une fois atteint [#id-3.-deployment-ready](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#id-3.-deployment-ready "mention"), votre serveur peut nécessiter du temps supplémentaire pour effectuer l'initialisation du moteur et [#state-management](#state-management "mention") (restauration de l'état). Engagez-vous des coûts supplémentaires pour le calcul ou le transfert de données avec les services de jeu ? Ce temps d'attente affecte-t-il l'expérience du joueur ?
* Pouvez-vous masquer le chargement du serveur avec une scène de chargement, un mini-jeu, un hall d'attente ou d'autres moyens ?

**Les joueurs sont-ils liés à des instances de serveur spécifiques ou peuvent-ils migrer facilement ?**

* Comment la connexion à un serveur différent influence-t-elle le compte du joueur, l'historique des achats, l'expérience sociale, la progression, l'inventaire et autres aspects du gameplay ?
* Examinez votre [#recovery-objectives](#recovery-objectives "mention") et assurez-vous que les données critiques ne sont pas perdues.
* Mettez en œuvre des méthodes automatisées ou des outils pour joueurs afin de restaurer les données critiques.
* Fournissez un support humain et communiquez avec votre communauté au sujet des pannes et des problèmes.

## 🔎 Découvrabilité

Pour trouver des serveurs actifs acceptant de nouveaux joueurs, mettez en œuvre une ou plusieurs méthodes de découverte :

* Permettez aux joueurs de parcourir les serveurs et de choisir dans une liste avec [server-browser](https://docs.edgegap.com/docs.edgegap.com-fr/learn/server-browser "mention").
* Démarrez de nouvelles parties lorsque suffisamment de joueurs se joignent [appariement](https://docs.edgegap.com/docs.edgegap.com-fr/learn/appariement "mention").
  * Ajouter des joueurs pour [remplacer les départs dans les matchs existants avec remplissage (backfill)](https://docs.edgegap.com/docs.edgegap.com-fr/appariement/matchmaker-in-depth#backfill).
* [Implémentez un backend de jeu personnalisé ou tiers pour découvrir les serveurs](https://docs.edgegap.com/docs.edgegap.com-fr/advanced-features/managed-clusters#nakama-by-heroic-labs).

## 💭 Configuration & État

Intégrez des services pour définir les exigences initiales du serveur et gérer l'état des joueurs et des serveurs.

### Gestion de la configuration

La configuration se réfère aux **données initiales transmises à votre serveur lors du déploiement :**

* [variables injectées spécifiques à l'environnement](https://docs.edgegap.com/docs.edgegap.com-fr/learn/application-and-versions#other-parameters-optional):
  * par ex. données de compatibilité version client/serveur,
* [emplacement du serveur](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#arbitrium_deployment_location-detailed-information-about-deployment-location), [ports du serveur](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#arbitrium_ports_mapping-detailed-information-about-your-internal-and-external-ports) et [autres informations serveur](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#injected-environment-variables),
* [informations de matchmaking](https://docs.edgegap.com/docs.edgegap.com-fr/appariement/matchmaker-in-depth#injected-environment-variables) ou [variables de déploiement personnalisées](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#custom-variables),
* paramètres, clés et secrets d'intégration tierce.

{% hint style="info" %}
**La configuration est immuable**  - elle est lue une fois après le démarrage de votre serveur et ne change pas par la suite.
{% endhint %}

### Gestion de l'état

L'état se réfère aux données décrivant le **résultat d'une série d'actions précédentes des joueurs et d'événements serveur :**

* connexion du joueur, changements d'état contrôlés par le joueur (par ex. [Pion](https://dev.epicgames.com/documentation/en-us/unreal-engine/pawn-in-unreal-engine)),
* changements liés aux objets contenus dans le niveau/la scène (par ex. [Acteur](https://dev.epicgames.com/documentation/en-us/unreal-engine/actors-in-unreal-engine), [Objet de jeu](https://docs.unity3d.com/6000.0/Documentation/Manual/GameObjects.html)),
* changements liés à [mode de jeu](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-mode-and-game-state-in-unreal-engine#gamemodes), [état du jeu](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-mode-and-game-state-in-unreal-engine#gamestate), ou [scène de jeu](https://docs.unity3d.com/6000.0/Documentation/Manual/CreatingScenes.html) informations.

{% hint style="info" %}
**Les données d'état changent fréquemment.** Les clients sont mis à jour de façon sélective sur les informations pertinentes par l'autorité serveur.
{% endhint %}

{% hint style="success" %}
**Effectuez des sauvegardes fréquentes de l'état pour prévenir la perte de données** en cas de problèmes inattendus côté client ou serveur :

* de manière asynchrone en temps réel en utilisant un service tiers, par ex. [Nakama par Heroic Labs](https://docs.edgegap.com/docs.edgegap.com-fr/advanced-features/managed-clusters#nakama-by-heroic-labs),
* au démarrage ou à l'arrêt client/serveur, sous forme de fichiers d'état désérialisés dans [stockage d'objets cloud](https://www.linode.com/products/object-storage/).
  {% endhint %}

Les objets de jeu désignent généralement un propriétaire qui les contrôle, cela peut être soit le serveur soit un joueur.&#x20;

#### Objets possédés par le serveur

Les objets possédés par le serveur ne peuvent être manipulés que par le serveur. Les joueurs connectés ont un accès en lecture limité aux objets possédés par le serveur. Les objets possédés par le serveur ne sont généralement pas partagés avec d'autres serveurs.

{% hint style="success" %}
Les objets possédés par le serveur peuvent être **chargés par un serveur de remplacement en cas de crash serveur inattendu**. Utilisez [ID de déploiement](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#basic-information) pour identifier votre nouveau fichier de sauvegarde lors du premier lancement, et pour stocker l'état des objets possédés par le serveur.
{% endhint %}

#### Objets possédés par le joueur

Les objets possédés par le joueur peuvent être manipulés à la fois par les joueurs et par le serveur. Assigner la propriété d'objets persistants aux joueurs facilite la migration vers d'autres serveurs ultérieurement.

{% hint style="success" %}
**Sauvegardez l'état des objets possédés par le joueur sur l'appareil du joueur ou un backend de jeu** entre les sessions de jeu.
{% endhint %}

{% hint style="info" %}
Prévenez la triche en validant les changements avec l'autorité serveur. Autorité et propriété peuvent être séparées.
{% endhint %}

### Objectifs de récupération

En cas de problèmes, certaines catégories de données peuvent être plus sensibles à la perte de données, par exemple :

* données de compte, d'abonnement, d'achat et de microtransaction - **critiques**,
* données de progression, de succès, de classements et d'inventaire - **important**,
* données de détection de triche, modération, performance et suivi des erreurs - **important**,
* données de comportement des joueurs, sociales, de chat - **faible importance**.

{% hint style="success" %}
**Mettez en œuvre la restauration des achats à partir d'une source indépendante d'historique des transactions** pour une meilleure expérience.
{% endhint %}

Nous recommandons vivement de discuter des éléments suivants au sein de votre équipe :

* catégories de données traitées dans vos clients et serveurs de jeu,
* importance et sensibilité de chaque catégorie pour votre entreprise et vos joueurs,
* Recovery Point Objective (RPO) - quantité acceptable de perte de données avant qu'un dommage grave ne survienne,
* Recovery Time Objective (RTO) - durée d'indisponibilité acceptable avant qu'un dommage grave ne survienne.

## 👀 Observabilité

Les serveurs persistants à longue durée posent de nouveaux défis d'observabilité, notamment la détection d'anomalies dans la surveillance, la journalisation et le suivi des bugs.

Nous **recommandons fortement de mettre en place des alertes pour les redémarrages de serveurs** pour gagner en visibilité sur les problèmes.

Notre [endpoint-storage](https://docs.edgegap.com/docs.edgegap.com-fr/docs/endpoint-storage "mention") **intégration des logs** **transfère uniquement les journaux** **après** [#id-5.-deployment-stopped](https://docs.edgegap.com/docs.edgegap.com-fr/learn/deployments#id-5.-deployment-stopped "mention"), ajoutez des logs personnalisés et du suivi de bugs (comme [Sentry](https://sentry.io/welcome/)) pour dépanner les défaillances partielles et les bugs.

{% hint style="success" %}
Envisagez de réserver [flottes-privees](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/flottes-privees "mention") capacité de veille pour les jeux aux schémas de trafic prévisibles.
{% endhint %}

[^1]: le CCU le plus bas de la journée
