Le Web en Mode Push
Depuis son apparition dans les années 1990 jusqu’à l’aube des années 2000, le web était principalement utilisé pour publier et consulter des documents, généralement statiques et chargées de manière atomique. Au début des années 2000, de nombreux sites ont mis en oeuvre des comportements dits dynamiques : les pages, toujours chargées de manière atomique, sont alimentées en contenu par des requêtes transactionnelles vers des bases de données. Aujourd’hui, les sites sont devenus de véritables applications web à comportement très sophistiqué. Notamment les pages ne sont plus chargées de manière atomique mais de manière parcellaire. C’est le cas par exemple de GMail, Twitter ou encore 280slides. Ces applications ont en effet besoin de charger des informations situées dans des parcelles de la page. Par exemple, lorsqu’un utilisateur de GMail reçoit un nouveau message, la page se met à jour automatiquement sans avoir à recharger la page.
Pour réaliser ce chargement régulier d’informations, la méthode la plus répandue aujourd’hui est l’attente active, ou « polling ». À intervalles de temps réguliers, un appel AJAX, sous forme de requête HTTP est envoyé au serveur pour lui demander si de nouvelles informations existent.
Les inconvénients de l’attente active
L’attente active exploite le comportement standard du protocole HTTP. Le client envoie une requête au serveur, le serveur répond et une fois la réponse reçue la connexion est fermée. A priori, le protocole HTTP n’intègre pas nativement le push.
Cependant, l’attente active présente deux inconvénients majeurs :
- Gaspillage de ressources. Le client ne sachant pas si des informations plus à jour existent sur le serveur ou non, il est obligé de faire des requêtes répétées même quand il n’y a rien de nouveau sur le serveur. Cela entraîne une activité réseau inutile, ainsi qu’un traitement inutile des requêtes et des réponses côté client comme côté serveur. C’est d’autant plus problématique en environnement mobile où les ressources sont plus précieuses : mémoire et processeur sont plus limités, et l’utilisateur est susceptible de payer sa connexion à la quantité de données échangée.
- Un délai de latence. Les requêtes pour recevoir des nouvelles du serveur étant forcément espacées, l’utilisateur recevra les mises à jour avec du retard. Là ou un délai de quelques minutes est acceptable pour le courrier électronique, pour une application de discussion instantanée il est nécessaire de recevoir les messages dans l’instant, en temps réel.
En mode polling, un choix judicieux de la largeur de l’intervalle entre deux requêtes permet de trouver le bon compromis entre le gaspillage des ressources et le délai de latence, en fonction des applications. Avec un délai court les informations sont fraîches mais la consommation en ressources est importante. Avec un délai plus long la consommation en ressources reste maîtrisée mais les informations arrivent en retard.
Comet : Le Push avec les Navigateurs Actuels
Bien que le push ne soit pas prévu par le protocole HTTP, il est possible de l’implémenter en utilisant des caractéristiques naturelles dudit protocole. L’idée est que le serveur ne répond pas tout de suite mais attend d’avoir de nouvelles informations avant d’envoyer la réponse, ou une partie de la réponse. Ces techniques sont regroupées sous le terme de Comet et nécessitent de configurer le serveur web pour accepter un délai long avant la réponse de la requête, et ne pas couper les connexions en cas de délai écoulé.
iframe cachée
Cette technique consiste à utiliser une iframe cachée, et y charger une URL que le serveur utilisera pour pousser les nouvelles informations. Le contenu de cette iframe invisible sera chargé par blocs. Du point de vue du protocole, tout se passe comme si le serveur ou le réseau mettait plus de temps que d’habitude pour charger la page - sauf que dans ce cas, il ne s’agit nullement de limitations du serveur ou du réseau : le serveur attend d’avoir de nouvelles informations pour les pousser immédiatement vers l’iframe.
Cette technique fonctionne dans tous les navigateurs, cependant la gestion des erreurs est difficile.
Requête XMLHttpRequest gardée ouverte
XMLHttpRequest est le type de requête que les applications Ajax utilisent pour charger des données depuis le serveur sans avoir à recharger la page complète. Dans certains navigateurs, il est possible de l’utiliser en mode multipart, c’est-à-dire que la réponse sera chargée par blocs ; c’est ce qui est utilisé ici pour du push. Là encore, le serveur poussera un nouveau bloc dès qu’il sera nécessaire d’envoyer des nouvelles informations au client.
Le principal problème de cette approche est qu’elle ne fonctionne que dans les navigateurs basés sur Gecko, c’est-à-dire Firefox et ceux qui partagent son moteur de rendu. Internet Explorer étant basé sur Trident, Chrome et Safari sur Webkit et Opera sur Presto.
Attente active prolongée (long polling)
Il s’agit toujours d’une requête XMLHttpRequest, mais cette fois-ci elle est utilisée classiquement, et la réponse arrive en un seul bloc. Par contre, le serveur ne répondra pas avant d’avoir de nouvelles informations. Dès qu’il reçoit une réponse, le client soumet une nouvelle requête au serveur pour que celui-ci puisse à nouveau lui communiquer de nouvelles informations.
Un exemple d’application de discussion en temps réel utilisant l’attente active prolongée se trouve dans la distribution du framework Play. Il s’agit de “chat“, une application simple de discussion en temps réel.
Cette approche fonctionne dans tous les navigateurs, et c’est souvent la méthode la plus adaptée.
Et demain ? L’Apparition des WebSockets
Bien que les approches Comet fonctionnent, elles restent une forme de « bricolage » sur le protocole HTTP. Pour fournir un façon plus simple et standard de réaliser du push dans les applications web, Google à introduit les Web Sockets. Celles-ci sont implémentées dans les versions les plus récentes du navigateur Google Chrome, et sont en cours de standardisation au sein du WHATWG, le groupe de travail à l’origine du HTML5. Mozilla Firefox le supportera dans sa version 3.7.
Les websockets fournissent une connexion bi-directionnelle, full-duplex entre le client et le serveur. Il est possible de faire transiter des données textuelles comme des données binaires, si nécessaires dans les deux directions à la fois.
Il faudra du temps avant que les navigateurs supportant les WebSockets soient suffisamment répandues pour pouvoir envisager leur utilisation sur un site public ; cependant Il est déjà possible de les utiliser en milieu fermé, tel qu’un intranet dont on contrôle le poste de travail.



















