Retour au blog Migration & Architecture

Votre application auto-hébergée a-t-elle besoin de connexions persistantes ? Checklist WebSockets, SSE et long polling

Guide pratique et indépendant des protocoles pour déterminer si une application auto-hébergée nécessite WebSockets, les événements envoyés par le serveur (SSE) ou le long polling — et ce que ce choix implique pour le routage, l’authentification, la montée en charge, la supervision et la planification des défaillances.

Schéma d’architecture montrant des clients de navigateur connectés, via un proxy inverse, à une application auto-hébergée utilisant WebSockets, SSE et long polling

Pourquoi les connexions persistantes relèvent du choix de l’application, et pas seulement d’un paramètre de proxy

Une exigence de connexion persistante modifie bien plus qu’une configuration de proxy inverse. Elle affecte le chemin réseau entre l’utilisateur et l’application, la façon dont les déploiements sont drainés, ce qui se produit après des changements d’authentification, la coordination entre plusieurs instances de l’application, ainsi que les signaux dont les opérateurs ont besoin lors d’un incident.

Partez de l’expérience utilisateur plutôt que d’une préférence de protocole. Une application peut parfaitement fonctionner avec le HTTP classique en requête-réponse pour les tâches d’administration, les rapports périodiques et les mises à jour non urgentes. D’autres usages peuvent sembler incomplets lorsque les mises à jour sont retardées ou lorsqu’une session interactive se reconnecte de façon répétée. La bonne question n’est pas « Le proxy prend-il en charge les WebSockets ? », mais « Quel parcours utilisateur dépend d’une connexion ouverte ou maintenue de manière répétée, et quel comportement est acceptable lorsqu’elle n’est pas disponible ? »

Pour un déploiement géré, confirmez les exigences dans la documentation actuelle de l’éditeur de l’application et testez le parcours réel après le déploiement. Airbip exécute les instances d’applications comme des charges de travail Docker sur des serveurs cloud et automatise le routage ainsi que les certificats TLS via Traefik et Let’s Encrypt. Cela peut simplifier l’infrastructure autour d’une application prise en charge, mais ne remplace pas la nécessité de valider le comportement temps réel propre à l’application, la conception des identités, le traitement des données et la responsabilité opérationnelle.

  • Identifiez l’écran, le parcours ou l’intégration qui nécessite une livraison rapide.
  • Définissez si l’application a besoin uniquement de mises à jour du serveur vers le navigateur, ou d’une messagerie interactive bidirectionnelle.
  • Consignez le repli attendu : actualisation, interrogation périodique, notification différée, file de nouvelles tentatives ou état hors ligne explicite.
  • Traitez les exigences de transport temps réel comme un critère d’acceptation avant la migration, et non comme une tâche d’optimisation après le lancement.
Pourquoi les connexions persistantes relèvent du choix de l’application, et pas seulement d’un paramètre de proxy

WebSockets, événements envoyés par le serveur et long polling : les différences opérationnelles

Les WebSockets commencent par une poignée de main d’ouverture HTTP, puis échangent des messages encadrés sur la connexion établie. Ils conviennent lorsqu’une application a besoin d’un canal bidirectionnel durable. La RFC 6455 définit également les trames de contrôle Ping et Pong, que les points de terminaison peuvent utiliser pour vérifier l’activité ou la réactivité.

Les événements envoyés par le serveur, couramment appelés SSE, utilisent l’interface EventSource du navigateur et le type MIME text/event-stream. Les SSE sont conçus pour la livraison d’événements du serveur vers la page. Ils conviennent souvent lorsque le navigateur reçoit principalement des mises à jour et envoie les commandes par des requêtes HTTP classiques. EventSource se reconnecte après la fermeture d’une connexion, sauf si le serveur envoie HTTP 204 No Content ; lors de la reconnexion, il peut aussi fournir un en-tête Last-Event-ID, permettant au serveur de déterminer le dernier identifiant d’événement reçu.

Le long polling maintient une requête HTTP jusqu’à une mise à jour, un changement d’état ou l’expiration d’un délai, après quoi le client ouvre généralement une nouvelle requête. Il peut fonctionner au travers d’une infrastructure HTTP connue, mais chaque livraison demeure un échange HTTP complet de requête-réponse. Les requêtes en attente consomment des ressources chez les clients, les serveurs, les passerelles et les proxys ; ses caractéristiques opérationnelles méritent donc des tests délibérés à la concurrence attendue.

  • Choisissez les WebSockets lorsque le produit nécessite un canal bidirectionnel durable et que l’éditeur documente ce transport.
  • Envisagez les SSE pour des flux unidirectionnels du serveur vers le navigateur, avec des requêtes HTTP pour les actions du client.
  • Envisagez le long polling lorsque l’application le prend en charge et que des mises à jour quasi temps réel sont utiles, sans nécessiter une connexion continuellement mise à niveau.
  • Ne supposez pas qu’un modèle est intrinsèquement plus simple : la complexité opérationnelle dépend de l’application, du comportement du client et de chaque intermédiaire sur le trajet.
WebSockets, événements envoyés par le serveur et long polling : les différences opérationnelles

Quels parcours utilisateur peuvent dépendre de connexions persistantes

Les connexions persistantes sont généralement justifiées par des modèles d’interaction, et non par une catégorie telle que CRM, analytique ou collaboration. Un indicateur de présence en direct, un espace d’édition partagé, une console opérationnelle en actualisation continue, une réponse d’IA en flux continu ou un fil de notifications intégré peuvent dépendre d’une livraison rapide par le serveur. Pourtant, une même application peut souvent comporter de nombreuses pages qui n’en ont pas besoin.

Classez chaque parcours selon ses conséquences. Un retard dans l’actualisation d’un tableau de bord peut être acceptable. Une interface de contrôle qui laisse un opérateur sans certitude qu’une action a été reçue peut ne pas l’être. De même, une fonctionnalité de collaboration peut devoir signaler que son canal en direct se reconnecte plutôt que d’afficher silencieusement un état obsolète.

Demandez à l’éditeur si ce comportement est nécessaire à la correction, préférable pour la réactivité ou simplement une amélioration facultative. Demandez également si l’application dispose d’un mode dégradé pris en charge. Ne déduisez pas les exigences de transport du marketing produit ou de la simple présence d’une interface de navigateur.

  • Collaboration : l’état partagé, la présence, les commentaires ou les alertes peuvent nécessiter une propagation rapide.
  • Interfaces opérationnelles : les changements d’état, l’avancement des tâches et les alertes peuvent nécessiter un indicateur explicite de fraîcheur.
  • Notifications : déterminez si un e-mail différé ou une consultation dans l’application constitue un repli acceptable.
  • Interfaces d’IA : distinguez une réponse diffusée en flux d’une requête qui peut simplement se terminer avant d’afficher son résultat.
  • Intégrations : déterminez si les événements entrants, les confirmations de livraison sortantes, ou les deux, reposent sur un canal de longue durée.

Checklist avant adoption : documentation de l’éditeur, chemin réseau, authentification, montée en charge et comportement en cas de défaillance

Avant d’adopter ou de migrer une application, établissez un profil de connexion court et étayé par des preuves. La documentation de l’éditeur doit être la source principale concernant les transports pris en charge, les chemins de points de terminaison, les en-têtes requis, le comportement d’authentification, les recommandations de proxy, la conception multi-instance et le comportement de repli attendu. Si la documentation n’est pas claire, testez le parcours précis dans un environnement représentatif plutôt que de faire des suppositions.

Cartographiez l’itinéraire complet : navigateur ou client, DNS, terminaison TLS, couche de diffusion de contenu ou de sécurité si présente, proxy inverse, équilibreur de charge, charge de travail applicative et tout composant de partage de messages requis par l’application. Un paramètre qui semble correct à la périphérie de l’application peut être neutralisé par un intermédiaire plus en amont avec un délai d’inactivité plus court ou une politique de connexion qui n’autorise pas le trafic prévu.

L’authentification demande une attention particulière car une connexion peut survivre à une requête de page. Déterminez comment l’application authentifie la connexion initiale, comment elle gère l’expiration des identifiants et ce qui se passe lorsque l’accès est révoqué alors qu’un canal est ouvert. Traitez ces sujets comme des questions de conception propres à l’application à vérifier, et non comme des propriétés universelles des transports.

  • Obtenez la documentation de l’éditeur sur les proxys et la montée en charge pour le mode de déploiement envisagé.
  • Listez chaque intermédiaire réseau et ses politiques de connexion, d’en-têtes et de délais d’expiration.
  • Vérifiez les exigences TLS et de domaine personnalisé ; Airbip prend en charge un sous-domaine Airbip ou un domaine personnalisé compatible.
  • Documentez l’authentification à l’établissement de la connexion, à l’expiration du jeton ou de la session, à la déconnexion et à la révocation de l’accès.
  • Testez les reconnexions attendues, les actualisations de navigateur, les redémarrages de l’application et l’indisponibilité temporaire du proxy.
  • Confirmez le modèle pris en charge par l’application pour plusieurs instances avant de concevoir une montée en charge horizontale.

Questions à poser à un hébergeur géré ou à une équipe de plateforme interne

Les questions utiles sont concrètes et liées au comportement documenté de l’application. Une équipe de plateforme peut expliquer la couche de routage, le processus de domaine et de certificat, les contrôles de cycle de vie, l’approche de sauvegarde et les limites de son service. Elle ne peut pas promettre de manière responsable qu’un transport d’application, une bibliothèque cliente ou une intégration tierce non documentés fonctionneront correctement sans validation.

Pour les déploiements Airbip, les points de départ pertinents comprennent le modèle de charge de travail Docker de l’application, l’automatisation du routage et de TLS via Traefik et Let’s Encrypt, les vérifications DNS, la gestion du cycle de vie du service et les sauvegardes quotidiennes, hebdomadaires et mensuelles configurables. Les sauvegardes sont importantes pour la récupérabilité, mais elles ne remplacent ni le drainage des connexions, ni la logique de nouvelle tentative côté client, ni un mode de défaillance temps réel testé.

  • La version prévue de l’application documente-t-elle les points de terminaison WebSocket, SSE ou long polling ainsi que les exigences de proxy ?
  • Où TLS se termine-t-il et les connexions WebSocket sécurisées sont-elles prises en charge sur l’ensemble du trajet prévu ?
  • Quels paramètres de délai s’appliquent à la couche de routage et quelles couches en amont imposent leurs propres limites ?
  • L’application peut-elle être redémarrée ou mise à jour avec une expérience de reconnexion définie pour les utilisateurs ?
  • Si plusieurs instances de l’application sont utilisées, quel composant partage les événements, la présence ou l’état lié aux connexions ?
  • Quels journaux et métriques sont disponibles lors d’un incident de connexion ?
  • Quelles responsabilités restent à la charge du client concernant les accès utilisateurs, la configuration de l’application, la conservation des données et la gouvernance ?

Proxys inverses et équilibreurs de charge : mises à niveau, délais, en-têtes transmis et limites de connexions

Pour les WebSockets, validez la poignée de main d’ouverture HTTP sur l’ensemble du trajet. Traefik documente la prise en charge de WS et WSS sans middleware WebSocket distinct et indique qu’il préserve les en-têtes de poignée de main pertinents tels que Origin et Sec-WebSocket-Key. Ce comportement d’infrastructure est utile, mais l’application déployée doit toujours accepter l’origine publique, construire des URL externes correctes et appliquer ses propres règles de sécurité.

Les en-têtes transmis sont importants lorsqu’une application doit connaître l’hôte, le schéma ou l’adresse client d’origine. Traefik ajoute automatiquement X-Forwarded-For, X-Real-Ip, X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto et X-Forwarded-Server lors du proxying. Vérifiez comment l’application approuve et interprète les en-têtes transmis, en particulier lorsqu’un autre proxy est placé devant la couche de routage.

Les délais doivent être évalués comme une chaîne. Les points d’entrée Traefik exposent des paramètres de délai de lecture, d’écriture et d’inactivité. Pour le long polling, la RFC 6202 indique qu’un serveur ou intermédiaire peut terminer une requête en attente avec HTTP 408 ou HTTP 504, et que le délai limitant peut se situer dans l’infrastructure plutôt que dans le navigateur. Les SSE peuvent nécessiter une sortie périodique de maintien en vie, car certains proxys anciens peuvent fermer une connexion HTTP autrement inactive. Les limites de connexions, la capacité en descripteurs de fichiers et l’utilisation des ressources en amont doivent également être examinées pour le nombre prévu de clients simultanés.

  • Confirmez le comportement de poignée de main et de mise à niveau WebSocket de bout en bout, et pas seulement au dernier proxy.
  • Alignez les pulsations ou messages de maintien en vie de l’application sur la politique d’inactivité pertinente la plus courte, lorsque l’application les prend en charge.
  • Définissez et testez les durées des requêtes de long polling par rapport aux délais des serveurs et intermédiaires.
  • Empêchez la mise en cache inappropriée des routes de long polling avec les contrôles de cache HTTP standard.
  • Vérifiez la gestion des origines et la configuration de confiance envers le proxy de l’application.
  • Testez la capacité de connexions ouvertes simultanées et observez la pression sur les ressources du proxy, de l’hôte et de l’application.

Effets des connexions persistantes sur les déploiements multi-instances et la conception des sessions

Une seule instance applicative peut éviter de nombreuses questions de systèmes distribués, mais elle ne supprime pas la nécessité de gérer les reconnexions et les redémarrages. Dès lors que le trafic est servi par plusieurs instances, un client connecté peut être attaché à une instance tandis qu’un événement est créé sur une autre. Si l’application doit diffuser des messages, partager la présence ou livrer des événements à des utilisateurs connectés ailleurs, elle a besoin de son mécanisme documenté pour partager les messages ou les événements liés aux connexions entre instances.

Les recommandations de HAProxy sur WebSocket illustrent le problème sous-jacent : chaque serveur WebSocket possède sa propre liste de clients connectés ; une livraison entre serveurs ou une diffusion nécessite donc que les messages soient partagés entre les serveurs. L’affinité de l’équilibreur de charge peut être pertinente pour certains modèles de session applicative, mais elle ne remplace pas de manière générale un état partagé. Elle ne peut pas faire connaître un événement à une instance qui ne l’a pas reçu.

Examinez séparément l’état : les sessions utilisateur, l’état d’autorisation, la propriété de la connexion, l’état des abonnements, l’historique des événements et les tâches en arrière-plan peuvent chacun nécessiter des mécanismes de stockage ou de coordination différents. Ne montez en charge qu’avec une architecture prise en charge par l’éditeur et testez la reconnexion d’un client à une instance différente.

  • Déterminez si l’application prend officiellement en charge plus d’une instance active.
  • Identifiez où sont stockés les sessions, abonnements et historiques d’événements.
  • Confirmez comment les diffusions entre instances et la livraison ciblée sont propagées.
  • Testez la perte d’une instance alors que des clients restent connectés aux autres.
  • Ne vous appuyez pas sur l’affinité de l’équilibreur de charge comme unique conception pour les événements partagés ou l’état durable.
  • Assurez-vous que les clients qui se reconnectent peuvent restaurer leur état ou demander en toute sécurité une vue à jour.

Signaux de supervision : clients connectés, déconnexions, taux de reconnexion, schémas d’erreurs et pression sur les ressources

Les canaux persistants nécessitent une observabilité permettant de distinguer une connexion silencieuse mais saine d’une connexion défaillante. Recueillez les nombres de connexions lorsque le proxy ou l’application les expose, mais interprétez-les avec l’âge des connexions, les raisons des déconnexions, les tentatives de reconnexion, les échecs de poignée de main, les erreurs de réponse et la fraîcheur visible par l’utilisateur. Il n’existe pas de seuil sain universel : les niveaux normaux dépendent de la population de clients de l’application, de la durée de session attendue, de l’activité de livraison de versions et de la forme du trafic.

Suivez à la fois le comportement du service et celui des clients. Une hausse du taux de déconnexion peut indiquer une incompatibilité de délais, une interruption réseau, un événement de déploiement ou un problème applicatif. Une vague de reconnexions après le rétablissement du service peut elle-même créer un pic de charge. La RFC 6455 recommande des reconnexions différées avec des délais progressivement plus longs après une fermeture anormale, ce qui aide les clients à ne pas submerger un service en cours de rétablissement.

La supervision des ressources reste essentielle. Le long polling peut accumuler des requêtes HTTP en attente. Les connexions de longue durée peuvent maintenir des sockets et consommer les ressources du proxy, du système d’exploitation et de l’application. Surveillez la capacité de connexion pertinente, le processeur, la mémoire, l’activité réseau et les journaux d’erreurs sur tout le trajet, puis analysez les changements par rapport à une référence plutôt que de vous fier à des objectifs numériques empruntés.

  • Clients connectés actuels et au pic, segmentés par point de terminaison lorsque possible.
  • Échecs de poignée de main, échecs d’autorisation et codes de réponse inattendus.
  • Raisons des déconnexions et distribution de la durée des connexions.
  • Taux de reconnexion, comportement des délais de nouvelle tentative et événements de déploiement ou réseau corrélés.
  • Requêtes de long polling en attente et réponses de délai telles que 408 ou 504.
  • Pression sur les ressources CPU, mémoire, sockets et réseau du proxy, de l’hôte et de l’application.
  • Un indicateur de fraîcheur ou de déconnexion destiné à l’utilisateur lorsque l’application en fournit un.

Questions fréquentes

Toutes les applications auto-hébergées ont-elles besoin de WebSockets ?

Non. De nombreuses applications fonctionnent très bien avec le HTTP classique. Les WebSockets ne sont appropriés que lorsque le parcours documenté de l’application nécessite un canal bidirectionnel durable. Les SSE, le long polling ou une actualisation périodique peuvent être plus adaptés dans d’autres cas.

Les SSE remplacent-ils les WebSockets ?

Pas de manière générale. Les SSE sont conçus pour la livraison d’événements du serveur vers la page avec EventSource et text/event-stream. Les WebSockets prennent en charge des messages encadrés dans les deux sens après la poignée de main d’ouverture. Le bon choix dépend du transport documenté et du modèle d’interaction de l’application.

Pourquoi le long polling nécessite-t-il des tests de délai ?

Une requête de long polling peut être terminée par le serveur applicatif ou par un intermédiaire. La RFC 6202 indique que les délais de l’infrastructure peuvent être plus courts que ceux du navigateur et entraîner des réponses HTTP 408 ou 504. Testez l’ensemble du chemin réseau.

Les applications WebSocket équilibrées en charge ont-elles besoin d’un état partagé ?

Lorsque des clients connectés à des instances différentes doivent recevoir les mêmes diffusions ou messages entre instances, l’application a besoin d’un moyen documenté de partager ces messages ou événements liés aux connexions. L’affinité de session ne résout pas à elle seule la livraison entre instances.

Que doivent voir les utilisateurs si un canal temps réel échoue ?

Préférez un état explicite et compréhensible : reconnexion en cours, déconnexion temporaire ou données potentiellement retardées. Lorsque cela est pris en charge, proposez un repli sûr tel qu’une actualisation, une nouvelle tentative ou une consultation différée. Évitez de présenter silencieusement des données obsolètes comme étant en direct.

Airbip peut-il héberger des applications utilisant des connexions persistantes ?

Airbip déploie les applications du catalogue comme des charges de travail Docker sur des serveurs cloud et automatise le routage et TLS via Traefik et Let’s Encrypt. Traefik prend en charge WS et WSS. Confirmez les exigences documentées de transport, de proxy, de montée en charge et de défaillance de l’application avant le déploiement, notamment pour les conceptions multi-instances ou à forte concurrence.

Sources et lectures complémentaires

  1. RFC 6455: The WebSocket Protocol — IETF / RFC Editor
  2. Server-sent events — WHATWG HTML Standard
  3. RFC 6202: Known Issues and Best Practices for the Use of Long Polling and Streaming in Bidirectional HTTP — IETF / RFC Editor
  4. WebSocket configuration tutorial — HAProxy Technologies
  5. WebSocket support — Traefik Labs
  6. Traefik Headers middleware reference — Traefik Labs
  7. Traefik EntryPoints reference — Traefik Labs
  8. Docker Compose services reference — Docker
  9. Explore Termination Behavior for Pods and Their Endpoints — Kubernetes