Créer des connexions persistantes avec WebSockets

Vous pouvez utiliser WebSockets pour créer une connexion persistante à partir d'un client (tel qu'un appareil mobile ou un ordinateur) vers une instance App Engine. La connexion établie permet un échange de données bidirectionnel entre le client et le serveur à tout moment, ce qui réduit le temps de latence et optimise l'utilisation des ressources.

WebSockets

Le protocole WebSockets, défini dans le document RFC 6455, fournit un canal de communication en duplex intégral entre un client et un serveur. Le canal est mis en place à partir d'une requête HTTP(S) avec un en-tête "Upgrade".

Cas d'utilisation types de WebSockets :

  • Mises à jour d'événements en temps réel, telles que les flux sur les médias sociaux, les résultats sportifs, les actualités ou les cours boursiers
  • Notifications utilisateur, telles que les mises à jour de logiciels ou de contenus
  • Applications de chat
  • Outils d'édition collaboratifs
  • Jeux multijoueurs

Les WebSockets sont toujours disponibles pour votre application sans qu'aucune configuration supplémentaire ne soit nécessaire. Une fois la connexion WebSockets établie, elle expire au bout d'une heure.

Exécuter un exemple d'application avec WebSockets

Tout d'abord, suivez les instructions de la section "Hello World!" pour Ruby sur App Engine afin de configurer votre environnement et votre projet et de comprendre la structure des applications Ruby dans App Engine.

Cloner l'exemple d'application

Copiez les exemples d'application sur votre ordinateur local et accédez au répertoire websockets :

git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
cd ruby-docs-samples/appengine/websockets/

Exécuter l'exemple en local

  1. Installez les dépendances pour ce projet.

    bundle install
    
  2. Démarrez un serveur Web local :

    bundle exec ruby app.rb -p 8080
    
  3. Dans votre navigateur Web, saisissez l'adresse suivante :

    http://localhost:8080
    

Déployer et exécuter l'exemple d'application dans App Engine

Pour déployer votre application dans l'environnement flexible App Engine, exécutez la commande suivante depuis le répertoire où se trouve votre fichier app.yaml :

gcloud app deploy

Vous pouvez ensuite diriger votre navigateur vers https://[YOUR_PROJECT_ID].appspot.com/

Affinité de session

Certains clients ne sont pas compatibles avec WebSockets. Pour contourner ce problème, de nombreuses applications utilisent des bibliothèques telles que Socket.io qui s'appuient sur un long polling HTTP avec des clients qui ne sont pas compatibles avec WebSockets.

En règle générale, App Engine répartit les requêtes uniformément entre les instances disponibles. Cependant, en cas de long polling HTTP, plusieurs requêtes séquentielles d'un utilisateur donné doivent atteindre la même instance.

Pour permettre à App Engine d'envoyer des requêtes du même utilisateur vers la même instance, vous pouvez activer l'affinité de session. App Engine identifie ensuite les requêtes envoyées par les mêmes utilisateurs en inspectant un cookie et achemine celles-ci vers la même instance.

L'affinité de session dans App Engine est mise en œuvre de la manière la plus optimale possible. Lors du développement de votre application, vous devez toujours partir du principe que l'affinité de session n'est pas garantie. Un client peut perdre son affinité avec l'instance cible dans les scénarios suivants :

  • L'autoscaler App Engine peut ajouter ou supprimer des instances qui diffusent votre application. L'application peut réaffecter la charge, et l'instance cible peut être déplacée. Pour réduire ce risque, assurez-vous que vous avez défini le nombre minimal d'instances permettant de gérer la charge attendue.
  • Si l'instance cible échoue lors des vérifications d'état, App Engine déplace la session vers une instance opérationnelle.
  • L'affinité de session est perdue lorsqu'une instance est redémarrée à des fins de maintenance ou de mise à jour logicielle. Les instances de VM de l'environnement flexible App Engine sont redémarrées toutes les semaines.

L'affinité de session n'étant pas garantie, n'utilisez celle-ci que pour tirer parti de la capacité de socket.io et d'autres bibliothèques à s'appuyer sur le long polling HTTP, dans les cas où la connexion est interrompue. Vous ne devez jamais utiliser l'affinité de session pour créer des applications avec état.

Activer et désactiver l'affinité de session

Par défaut, l'affinité de session est désactivée pour toutes les applications App Engine. Elle est définie au niveau de la version de votre application et peut être activée ou désactivée lors du déploiement.

Pour activer l'affinité de session pour votre version d'App Engine, ajoutez l'entrée suivante à votre fichier app.yaml :

network:
  session_affinity: true

Une fois que la version est déployée avec le fichier "app.yaml" mis à jour, la diffusion des nouvelles requêtes commence à partir de la même instance, tant que cette instance est disponible.

Pour désactiver l'affinité de session, supprimez l'élément correspondant du fichier app.yaml ou définissez sa valeur sur "false" :

network:
  session_affinity: false