Polydesk-logotype
Polydesk.ai — Header

Long Polling

Le long polling est une technique de communication HTTP dans laquelle le client envoie une requête au serveur, qui maintient la connexion ouverte jusqu’à ce qu’une donnée soit disponible ou qu’un délai d’expiration (timeout) soit atteint, permettant ainsi des mises à jour quasi temps réel sans recourir à un protocole spécialisé.

Long Polling en bref
Type
Technique de communication serveur → client sur HTTP
Protocole sous-jacent
HTTP/1.1 (compatible HTTP/1.0)
Direction
Unidirectionnelle (serveur vers client, via requêtes initiées par le client)
Latence typique
Quasi nulle lorsque des données sont disponibles ; variable lors du timeout
Spécification
RFC 6202 (bonnes pratiques, publiée en 2011)
Alternatives modernes
WebSocket, Server-Sent Events (SSE), WebTransport
Cas d’usage courants
Notifications, chat legacy, fallback réseau contraint
Verdict
Fiable comme solution de repli, mais dépassé pour les projets neufs à grande échelle

Comment fonctionne le long polling

Le long polling repose sur un détournement élégant du modèle requête-réponse HTTP. Plutôt que de répondre immédiatement (comme dans le short polling classique), le serveur garde la connexion ouverte et ne renvoie une réponse que lorsqu’il a effectivement quelque chose à transmettre. Voici le cycle complet :

1. Le client envoie une requête HTTP standard (généralement un GET). Cette requête contient souvent un identifiant de séquence (par exemple ?since=msg_999) pour indiquer au serveur les données déjà reçues.

2. Le serveur réceptionne la requête et vérifie ses données. Deux scénarios se présentent : si de nouvelles données existent, il répond immédiatement ; sinon, il maintient la connexion ouverte et attend.

3. Un timeout est configuré côté serveur (typiquement entre 20 et 60 secondes). Si aucune donnée n’arrive dans ce délai, le serveur renvoie une réponse vide pour éviter que la connexion ne soit coupée par un proxy intermédiaire ou par le navigateur lui-même.

4. Dès réception de la réponse (avec ou sans données), le client ouvre immédiatement une nouvelle requête. Le cycle recommence, créant une boucle quasi permanente de connexion entre le client et le serveur.

Ce mécanisme crée l’illusion d’un push serveur, alors qu’en réalité le client initie systématiquement chaque échange. C’est ce qui différencie fondamentalement le long polling des WebSockets, où la connexion est bidirectionnelle et persistante par nature.

Exemple d’implémentation côté client (JavaScript)

Voici un squelette minimaliste en JavaScript pur, tel qu’on le retrouve dans de nombreuses documentations de référence :

async function subscribe() {
  try {
    const response = await fetch('/api/updates?since=' + lastId);

    if (response.status === 502) {
      // Timeout de connexion, on relance immédiatement
      await subscribe();
    } else if (response.status !== 200) {
      // Erreur serveur, on attend 1 seconde avant de réessayer
      await new Promise(resolve => setTimeout(resolve, 1000));
      await subscribe();
    } else {
      const data = await response.json();
      handleNewData(data);
      lastId = data.lastId;
      await subscribe(); // Relance immédiate
    }
  } catch (err) {
    // Erreur réseau, on attend avant de réessayer
    await new Promise(resolve => setTimeout(resolve, 3000));
    await subscribe();
  }
}

subscribe();

Ce code illustre les trois cas à gérer impérativement : la réponse valide (on traite les données puis on relance), le timeout (HTTP 502, on relance sans délai), et l’erreur (on introduit un délai d’attente avant de réessayer pour éviter de bombarder le serveur).

Exemple côté serveur (Node.js / Express)

app.get('/api/updates', (req, res) => {
  const since = req.query.since;

  // Vérifier si de nouvelles données existent
  const newData = checkForUpdates(since);

  if (newData) {
    return res.json(newData);
  }

  // Pas de données : on attend avec un timeout de 30s
  const timeout = setTimeout(() => {
    res.json({ data: [], lastId: since });
  }, 30000);

  // Si de nouvelles données arrivent entre-temps
  dataEmitter.once('update', (data) => {
    clearTimeout(timeout);
    res.json(data);
  });
});

Le point crucial côté serveur est la gestion de la mémoire : chaque connexion en attente consomme des ressources. Un serveur threadé classique (comme Apache en mode prefork) atteindra rapidement ses limites. C’est pourquoi les implémentations de long polling fonctionnent bien mieux sur des serveurs événementiels comme Node.js, Go avec goroutines, ou des frameworks Python asynchrones (FastAPI, Tornado).


Short polling vs long polling : la différence clé

La confusion entre short polling et long polling est fréquente. Pourtant, la distinction est nette :

Critère Short polling Long polling
Principe Le client interroge le serveur à intervalles fixes (ex. toutes les 5 s) Le client interroge le serveur, qui ne répond que lorsqu’il a des données
Requêtes « vides » Très nombreuses (la majorité ne ramène rien) Rares (le serveur ne répond que s’il a du contenu, ou au timeout)
Latence Égale à la moitié de l’intervalle en moyenne (ex. 2,5 s pour un intervalle de 5 s) Quasi nulle si des données sont disponibles au moment de la requête
Charge serveur Élevée : chaque intervalle génère une requête HTTP complète Réduite en nombre de requêtes, mais chaque connexion ouverte consomme de la mémoire
Implémentation Très simple (un setInterval suffit) Plus complexe (gestion des timeouts, reconnexion, backoff exponentiel)
Usage typique Mises à jour peu fréquentes où la latence n’est pas critique Notifications, chat, mises à jour en temps quasi réel

Pour illustrer concrètement : avec 100 000 utilisateurs connectés et un intervalle de polling de 5 secondes, le short polling génère environ 20 000 requêtes par seconde, dont la grande majorité retourne un corps vide. Le long polling ne génère du trafic que lorsqu’il y a effectivement de la donnée à transmettre, ce qui réduit drastiquement la charge réseau.


Long polling vs WebSocket vs SSE : comparatif complet

Le long polling n’est qu’une des trois approches principales pour la communication temps réel sur le web. Voici comment il se positionne face aux WebSockets et aux Server-Sent Events (SSE) :

Critère Long Polling WebSocket SSE (Server-Sent Events)
Direction Serveur → client (simulé via requêtes client) Bidirectionnel (full-duplex) Serveur → client uniquement
Protocole HTTP standard Protocole ws:// / wss:// (upgrade HTTP) HTTP standard (EventSource API)
Overhead par message ~150 à 200 octets d’en-têtes HTTP par livraison ~2 à 6 octets par frame ~5 octets par événement
Reconnexion auto Manuelle (code client) Manuelle (code client ou bibliothèque) Automatique (native dans le navigateur)
Compatibilité proxies/firewalls Excellente (HTTP pur) Parfois bloqué (upgrade refusé par certains proxies) Très bonne (HTTP pur)
Support navigateurs Universel Universel (moderne) Universel sauf IE (abandonné)
Scalabilité Limitée (une connexion HTTP par client en attente) Bonne (une connexion persistante, multiplexable) Bonne (connexion persistante, léger)
Cas d’usage idéal Fallback, environnements réseau contraints Chat, gaming, outils collaboratifs Notifications, flux unidirectionnels (dashboards, tickers)
Règle pratique Si votre application a besoin de communication bidirectionnelle fréquente (chat en temps réel, édition collaborative), optez directement pour les WebSockets. Si vous avez uniquement besoin de recevoir des mises à jour du serveur (notifications, flux d’actualités), les SSE sont plus simples et plus efficaces. Réservez le long polling comme solution de repli dans les environnements où les deux autres sont bloqués.

Impact sur les performances à grande échelle

Les chiffres parlent d’eux-mêmes. Avec 1 million d’événements par jour, la différence d’overhead entre le long polling (~800 octets d’en-têtes HTTP par livraison) et les WebSockets (~2 à 6 octets par frame) représente environ 760 Mo de trafic économisé quotidiennement côté WebSocket.

Un cas réel documenté illustre bien cette réalité : un service SaaS de notifications avec 30 000 utilisateurs simultanés consommait 8 serveurs c5.2xlarge AWS (environ 6 000 $/mois) avec du long polling, pour un usage CPU de 60 à 80 %. Après migration vers SSE, la même charge était gérée par 3 serveurs (environ 2 200 $/mois) avec un CPU à 20-30 %. L’économie annuelle : environ 45 000 $.


Avantages du long polling

Malgré son âge, le long polling conserve des atouts réels dans certains contextes :

Compatibilité universelle. Le long polling fonctionne avec n’importe quel client HTTP, n’importe quel navigateur, n’importe quel proxy. Aucun protocole spécial n’est requis. C’est du HTTP standard de bout en bout, ce qui le rend compatible même avec les infrastructures les plus anciennes ou les plus restrictives.

Traverse les firewalls sans configuration. Contrairement aux WebSockets, qui nécessitent un upgrade de protocole que certains proxies d’entreprise ou firewalls refusent, le long polling passe partout. Pour les applications déployées dans des environnements réseau contraints (intranets d’entreprise, réseaux gouvernementaux), c’est un avantage décisif.

Simple à comprendre et à débugger. Chaque échange est une requête-réponse HTTP classique, inspectable dans n’importe quel outil de développement (Chrome DevTools, Fiddler, Wireshark). Pas de protocole binaire à décoder, pas de frames WebSocket à interpréter.

Implémentation côté client triviale. Quelques lignes de JavaScript suffisent (comme montré plus haut). Pas besoin de bibliothèque tierce.

Fallback fiable pour les protocoles modernes. Des bibliothèques comme Socket.IO négocient automatiquement le meilleur transport disponible : WebSocket si possible, long polling sinon. Avoir cette solution de repli garantit que votre application fonctionne même dans les pires conditions réseau.


Limites et inconvénients

Le long polling présente des limitations structurelles qui expliquent pourquoi il est progressivement remplacé :

Chaque client monopolise une connexion serveur. Un serveur qui gère 10 000 clients en long polling maintient 10 000 connexions HTTP ouvertes simultanément. Sur un serveur threadé, cela signifie 10 000 threads ou processus en attente, ce qui est intenable. Même sur des serveurs événementiels (Node.js, Go), la consommation mémoire et le coût de gestion des descripteurs de fichiers restent significatifs.

L’overhead HTTP est élevé. Chaque cycle requête-réponse transporte l’intégralité des en-têtes HTTP (cookies, user-agent, content-type, etc.), soit 150 à 200 octets minimum par échange. Pour des applications à haute fréquence de messages, ce surcoût devient prohibitif.

La gestion des timeouts est délicate. Les proxies intermédiaires, les load balancers et les CDN ont chacun leurs propres limites de timeout. Si un proxy coupe la connexion avant le timeout du serveur, le client ne reçoit pas la réponse attendue. Il faut aligner les timeouts à tous les niveaux de l’infrastructure, ce qui est une source fréquente de bugs en production.

Pas de garantie d’ordre des messages. Si un client a plusieurs onglets ouverts ou si la reconnexion chevauche une réponse en cours, il est possible de recevoir des messages en double ou dans le désordre. La RFC 6202 documente explicitement ce problème.

Les tempêtes de reconnexion (reconnect storms). Lorsqu’un serveur redémarre ou qu’un réseau bascule, tous les clients tentent de se reconnecter simultanément. Sans mécanisme de backoff exponentiel côté client, cette avalanche de requêtes peut écraser le serveur au redémarrage.

Scalabilité horizontale complexe. Répartir des connexions long polling entre plusieurs serveurs via un load balancer nécessite une gestion de session (sticky sessions ou état partagé). Si le client est redirigé vers un autre serveur entre deux requêtes, le contexte de sa session est perdu.

Piège classique en production Sur mobile, les réseaux basculent fréquemment entre Wi-Fi et 4G/5G, ce qui change l’adresse IP du client. Chaque changement de réseau provoque une déconnexion et une reconnexion. Le long polling gère mal ces transitions comparé aux WebSockets, qui peuvent au moins détecter la coupure via un mécanisme de heartbeat.

Quand utiliser le long polling

Le long polling reste pertinent dans des scénarios précis. Voici les cas où il constitue un choix raisonnable :

Comme mécanisme de fallback. Votre application utilise les WebSockets en priorité, mais certains de vos utilisateurs sont derrière des proxies d’entreprise qui bloquent l’upgrade WebSocket. Le long polling prend le relais automatiquement. C’est exactement l’approche de bibliothèques comme Socket.IO ou SignalR (ASP.NET).

Pour des mises à jour peu fréquentes. Si vos événements surviennent moins d’une fois par minute (notification de livraison, alerte système, mise à jour de statut), le long polling est plus économique en ressources qu’une connexion WebSocket permanente qui consomme de l’énergie pour maintenir son heartbeat.

Dans des environnements réseau très contraints. Certains réseaux d’entreprise, gouvernementaux ou industriels n’autorisent que le trafic HTTP/HTTPS standard sur les ports 80 et 443. Le long polling est alors la seule option temps réel disponible.

Sur des infrastructures legacy. Si votre backend est un serveur HTTP classique sans support WebSocket et que vous ne pouvez pas le migrer à court terme, le long polling vous offre du temps réel sans changement d’infrastructure.

Quand ne pas l’utiliser

Inversement, évitez le long polling si :

Vos messages arrivent à haute fréquence (plus d’un par seconde) : l’overhead HTTP devient un goulot d’étranglement. Vous avez besoin de communication bidirectionnelle (chat interactif, édition collaborative) : les WebSockets sont conçus pour cela. Vous visez une échelle massive (des dizaines de milliers de connexions simultanées) : le coût par connexion du long polling rend la scalabilité trop coûteuse. Vous démarrez un projet neuf sans contrainte legacy : SSE ou WebSockets offrent de meilleures performances dès le départ.


Bonnes pratiques d’implémentation

Côté client

Implémentez un backoff exponentiel. Après une erreur, attendez 1 seconde, puis 2, puis 4, puis 8, jusqu’à un maximum (par exemple 30 secondes). Cela évite les tempêtes de reconnexion.

let retryDelay = 1000;
const maxDelay = 30000;

async function subscribe() {
  try {
    const res = await fetch('/api/poll');
    retryDelay = 1000; // Réinitialiser après un succès
    // ... traiter la réponse
    subscribe();
  } catch (err) {
    await new Promise(r => setTimeout(r, retryDelay));
    retryDelay = Math.min(retryDelay * 2, maxDelay);
    subscribe();
  }
}

Envoyez un identifiant de séquence. Chaque requête doit indiquer au serveur le dernier message reçu (via un paramètre since, un timestamp ou un ID de séquence). Cela permet au serveur de ne renvoyer que les données nouvelles et de rattraper les messages manqués lors d’une déconnexion.

Limitez à une seule connexion long poll par onglet. Les navigateurs limitent le nombre de connexions HTTP simultanées vers un même domaine (6 pour la plupart). Si votre application ouvre un long poll par onglet, vous risquez de saturer cette limite et de bloquer les autres requêtes HTTP de votre page.

Côté serveur

Utilisez un runtime asynchrone. Node.js, Go, ou des frameworks Python asynchrones (FastAPI, Tornado) gèrent des milliers de connexions en attente sans bloquer de threads. Un serveur threadé comme Apache en mode prefork est fondamentalement inadapté au long polling.

Configurez un timeout cohérent avec votre infrastructure. Si votre load balancer (AWS ALB, Nginx, Cloudflare) coupe les connexions inactives après 60 secondes, configurez votre timeout de long polling à 50 secondes maximum. Gardez toujours une marge de sécurité.

Implémentez un rate limiting. Limitez le nombre de connexions long poll par client (par adresse IP ou par token d’authentification) pour vous protéger contre les abus et les attaques DDoS.

Gérez proprement la fermeture des connexions. Lorsqu’un client se déconnecte (événement close ou aborted en Node.js), libérez immédiatement les ressources associées (timers, listeners) pour éviter les fuites mémoire.


Le long polling dans l’écosystème moderne

Frameworks et bibliothèques

Plusieurs bibliothèques populaires intègrent le long polling comme transport de repli :

Socket.IO négocie automatiquement le meilleur transport disponible. Il commence par le long polling (pour une connexion rapide), puis bascule vers les WebSockets si le réseau le permet. Cette approche hybride garantit une compatibilité maximale.

SignalR (écosystème .NET) utilise la même stratégie : WebSocket en priorité, SSE ensuite, long polling en dernier recours.

Le protocole Bayeux (développé par la fondation Dojo en 2006-2007) a été l’un des premiers à formaliser l’utilisation du long polling pour la communication bidirectionnelle sur HTTP. Il est aujourd’hui principalement historique.

BOSH (Bidirectional-streams Over Synchronous HTTP), utilisé dans le monde XMPP, est une autre implémentation notable qui repose sur le long polling avec deux connexions TCP simultanées.

Contexte historique

Le long polling a été la première technique réellement fonctionnelle pour simuler du push serveur dans les navigateurs web. Avant la standardisation des WebSockets (RFC 6455 en 2011), le long polling et la technique apparentée de « Comet » étaient les seules options pour construire des applications web temps réel.

Le chat Facebook web a longtemps utilisé le long polling avant de migrer vers d’autres protocoles. Le terme « Comet » (inventé en 2006 par Alex Russell) désignait un ensemble de techniques, dont le long polling, pour pousser des données du serveur vers le client via HTTP. Ce terme est aujourd’hui considéré comme obsolète.

RFC 6202 : la référence officielle

Publiée en avril 2011, la RFC 6202 documente les problèmes connus et les bonnes pratiques pour l’utilisation du long polling et du streaming HTTP bidirectionnel. Elle couvre notamment la limite à deux connexions simultanées par domaine (héritée de HTTP/1.1), la gestion des proxies intermédiaires, et les stratégies de timeout. Si vous implémentez du long polling en production, cette RFC est une lecture indispensable.


Long polling et les outils IA temps réel

Dans le contexte de l’IA, le long polling apparaît dans certains cas spécifiques. Les API de modèles de langage qui génèrent des réponses longues utilisent parfois une variante du long polling pour vérifier la complétion d’une tâche asynchrone : le client soumet un prompt, reçoit un identifiant de tâche, puis interroge régulièrement le serveur pour savoir si la réponse est prête.

Cependant, la tendance dominante dans les API IA modernes est le streaming via SSE. L’API d’OpenAI, l’API d’Anthropic (Claude), et la plupart des fournisseurs d’inférence utilisent des Server-Sent Events pour transmettre les tokens au fur et à mesure de leur génération. Le long polling est trop grossier pour ce cas d’usage : il obligerait à attendre la fin complète de la génération avant de renvoyer le résultat, ce qui dégraderait l’expérience utilisateur.

Les outils de productivité IA comme Slack AI ou Notion AI s’appuient sur les WebSockets de leurs plateformes respectives pour diffuser les réponses en temps réel dans l’interface, pas sur du long polling.


Glossaire des termes associés

Terme Définition rapide
Short polling Le client interroge le serveur à intervalles réguliers, qu’il y ait des données ou non
WebSocket Protocole de communication full-duplex sur une connexion TCP persistante
SSE (Server-Sent Events) Mécanisme HTTP natif permettant au serveur de pousser des événements vers le client via l’API EventSource
Comet Terme générique (historique) désignant les techniques de push serveur sur HTTP, dont le long polling
Pub/Sub Pattern d’architecture où les producteurs publient des messages sur des canaux, et les consommateurs s’y abonnent
Message Queue File d’attente qui stocke et distribue des messages entre producteurs et consommateurs
WebTransport Protocole émergent basé sur HTTP/3 offrant du multiplexing et de la backpressure native
BOSH Bidirectional-streams Over Synchronous HTTP, utilisé dans XMPP

Verdict

Le long polling est une technique historiquement importante qui a permis l’essor des applications web temps réel avant l’arrivée des WebSockets. Il reste pertinent comme mécanisme de fallback dans les environnements réseau contraints et pour les cas d’usage à faible fréquence de messages.

Pour un projet neuf, la recommandation est claire : utilisez les SSE pour les flux unidirectionnels (notifications, dashboards, streaming de tokens IA) et les WebSockets pour les interactions bidirectionnelles (chat, collaboration). Ne démarrez un long polling qu’en dernier recours ou comme couche de compatibilité automatique via une bibliothèque comme Socket.IO.

En résumé : le long polling n’est pas mort, mais il n’est plus le premier choix. Considérez-le comme le diesel de la communication temps réel : fiable, universellement compatible, mais dépassé en performances par les alternatives modernes.


FAQ

Quelle est la différence entre le long polling et les WebSockets ?

Le long polling utilise des requêtes HTTP successives : le client envoie une requête, le serveur la maintient ouverte jusqu’à avoir des données, puis le client en envoie une nouvelle. C’est du HTTP standard, unidirectionnel côté serveur. Les WebSockets établissent une connexion persistante et bidirectionnelle après un handshake initial : les deux parties peuvent envoyer des données à tout moment sans ouvrir de nouvelle requête. Les WebSockets offrent une latence plus faible et un overhead réseau minimal (~2 octets par frame vs ~200 octets d’en-têtes HTTP pour le long polling). Utilisez les WebSockets dès que vous avez besoin de communication bidirectionnelle ou de haute fréquence de messages.

Le long polling est-il encore utilisé en production ?

Oui, mais principalement comme mécanisme de repli. Des bibliothèques très répandues comme Socket.IO et SignalR l’utilisent automatiquement lorsque les WebSockets ne sont pas disponibles (proxy bloquant, réseau d’entreprise restrictif). Certaines applications à faible fréquence de mises à jour (alertes système, vérification de statut) l’emploient aussi directement. Il est en revanche de moins en moins choisi comme transport principal pour les nouveaux projets, les SSE et les WebSockets étant plus performants et mieux standardisés.

Le long polling consomme-t-il beaucoup de ressources serveur ?

Chaque client en long polling monopolise une connexion HTTP ouverte sur le serveur. Avec un serveur asynchrone (Node.js, Go), maintenir des milliers de connexions en attente est gérable. Avec un serveur threadé (Apache prefork, PHP-FPM), chaque connexion bloque un thread ou un processus, ce qui devient rapidement un goulet d’étranglement. La consommation mémoire et CPU augmente aussi avec les cycles de timeout et de reconnexion. Pour un SaaS avec 30 000 utilisateurs simultanés, un benchmark documenté montre que le passage du long polling aux SSE a divisé par deux le nombre de serveurs nécessaires et réduit l’usage CPU de 60-80 % à 20-30 %.

Comment éviter les tempêtes de reconnexion avec le long polling ?

Le problème survient lorsque le serveur redémarre ou que le réseau bascule : tous les clients tentent de se reconnecter en même temps. La solution standard est le backoff exponentiel avec jitter (variation aléatoire). Après un échec, le client attend 1 seconde + un délai aléatoire, puis 2 secondes, puis 4, etc., jusqu’à un maximum. Le jitter empêche tous les clients de retenter exactement au même instant. Ajoutez aussi un mécanisme côté serveur pour limiter le nombre de nouvelles connexions par seconde (rate limiting) afin de protéger votre infrastructure pendant les phases de reprise.

Peut-on utiliser le long polling avec HTTP/2 ou HTTP/3 ?

Techniquement oui, mais cela n’a guère de sens. HTTP/2 supporte le multiplexing (plusieurs requêtes sur une seule connexion TCP), ce qui élimine l’un des principaux problèmes du long polling (la saturation de la limite de 6 connexions par domaine en HTTP/1.1). Cependant, si vous avez accès à HTTP/2, vous avez aussi accès aux SSE, qui sont un meilleur choix pour le streaming unidirectionnel. Et HTTP/3 introduit WebTransport, un protocole conçu explicitement pour la communication temps réel avec support natif du multiplexing et de la backpressure. En pratique, le long polling n’existe que parce que HTTP/1.1 ne proposait pas de meilleure alternative. Dès que votre stack supporte un protocole plus moderne, utilisez-le.

Polydesk.ai — Footer