Appearance
Polling
Principe
Le polling est une technique qui permet de simuler un échange de données en temps réel.
Il permet de contourner une limitation du protocole HTTP, qui empêche de conserver une connexion établi avec un serveur indéfiniement.
Attention
Cette technique n'est plus pertinente depuis la version 2 du protocole HTTP qui permet désormais d'établir un tunnel de connexion TCP permanent, même si la requête a été initiée depuis un client HTTP via l'en-tête Connection: keep-alive.
Le principe est simple : le développeur va écrire du code qui permet d'envoyer des requêtes HTTP à intervalles régulier, ce qui permet au client Web de pouvoir récupérer des données régulièrement.
Si cela est fait suffisamment régulièrement, elle donne l'impression au client qui ne se doute de rien que les données sont échangées en temps réel dès qu'une nouvelle données est envoyées depuis le serveur, sauf qu'il n'en est rien.
Code
Serveur
Comme nous le disions plus haut, il n'y a aucun code nécessaire côté serveur.
Client
Pour pouvoir utiliser du Polling, il est nécessaire de savoir en premier lieu ce que nous souhaitons récupérer et afficher sous une forme pseudo-temps réel.
Imaginons que nous récupérons les données du prix d'une action Apple en bourse. Nous souhaitons être mis au courant en temps réel si le cours d'une action est en hausse ou en baisse.
Pour cela, nous pouvons utiliser le code suivant.
typescript
function updateAppleShareVisually(json) {
// Mettre à jour visuellement
// via l'API Web DOM le cours ici
}
setInterval(() => {
fetch("share.finances.com/apple").then(response => {
if (response.ok) {
return response.json();
}
throw new Error("Bad response from the server");
}).then(json => {
updateAppleShareVisually(json);
}).catch(error => {
console.error(error);
});
}, 1000);
Comme nous le constatons, le code responsable de récupérer les données depuis le serveur et de les afficher visuellement est encapsulé dans la fonction setInterval.
Ce n'est pas plus compliqué que ça, c'est une stratégie qui est très simple à mettre en place, avec peu de contraintes.
Et comme vous pouvez le constater, nous pouvons tout à fait modifier l'interval de manière abritraire, c'est-à-dire que nous pourrions en théorie faire 1 appel toutes les 10ms.
typescript
function updateAppleShareVisually(json) {
// Mettre à jour visuellement
// via l'API Web DOM le cours ici
}
setInterval(() => {
fetch("share.finances.com/apple").then(response => {
if (response.ok) {
return response.json();
}
throw new Error("Bad response from the server");
}).then(json => {
updateAppleShareVisually(json);
}).catch(error => {
console.error(error);
});
}, 10);
Avantage
Contrairement à d'autres techniques comme le Server-Sent Event et le protocole WebSocket, il n'est absolument pas nécessaire d'écrire une seule ligne de code côté serveur.
Cela s'explique par le fait que ce n'est pas tout à fait une stratégie en temps réel, mais plutôt une stratégie en pseudo-temps réel qui permet de simuler des données échangées dynamiquement en temps réel.
Il est alors possible d'utiliser du Polling avec n'importe quelle API HTTP, quel que soit le langage de programmation, y compris s'il ne supporte que de vieux protocoles HTTP.
Inconvénient
Le Polling présente plusieurs limitations dont il est important de comprendre pour savoir quand il n'est pas intéressant de ne pas utiliser cette technique.
La première, qui a été cité plus haut, et que ce n'est pas réellement du temps réel. Cela signifie que bien qu'un intervalle puisse être aussi régulier que possible, il ne correspond pas au moment exact où une données est envoyée depuis le serveur vers le client.
La deuxième, c'est que le polling consomme beaucoup de ressources, bien plus que d'autres stratégies comme le Server-Sent Event et le protocole WebSocket.
En effet, le Polling repose sur le protocole HTTP, qui est lui-même basé sur le protocole TCP.
Chaque fois qu'une requête HTTP est envoyée, tout le processus de connexion est mis en place, c'est-à-dire la demande d'ouverture de connexion depuis le client vers le serveur, l'acceptation de cette ouverture depuis le serveur vers le client, et la confirmation envoyée du client au serveur.
Suite à ça, le client envoi une requête HTTP, avec l'envoi tous les en-têtes HTTP nécessaires et le corps de la requête éventuellement, le serveur envoi à son tour une réponse HTTP, avec l'envoi d'en-têtes et un corps de réponse.
Également, si la première requête mets plus de temps que le délai entre deux requêtes, cela peut avoir un impact négatif non seulement sur le réseau (abondement des requêtes), mais aussi sur l'affichage puisque les données n'arriveraient plus dans l'ordre, causant des erreurs visuelles sur les données (par exemple, un utilisateur qui apparaît comme supprimé une seconde, puis qui réapparait une autre seconde, puis qui disparaît finalement après une suppression).
Enfin, la demande de fermeture de connexion est envoyée du client au serveur, et le serveur confirme la fermeture de la connexion.
Toutes ces étapes sont nécessaires, néanmoins le Polling peut alourdir la bande passante car toutes ces étapes seront donc répétées à chaque fois qu'une nouvelle requête HTTP sera envoyée pour récupérer des données, et cela de manière régulière.