323 votes

Dans quelles situations AJAX long/short polling serait-il préférable à HTML5 WebSockets ?

Je suis en train de créer une petite application de chat pour des amis, mais je ne sais pas comment obtenir des informations en temps voulu qui ne soient pas aussi manuelles ou aussi rudimentaires que de forcer un rafraîchissement de page.

Actuellement, j'implémente cette fonction en utilisant AJAX, mais cela présente l'inconvénient de solliciter régulièrement le serveur lorsqu'un court délai s'écoule.

En faisant des recherches sur les sondages long/short, je suis tombé sur les WebSockets HTML5. Ce site semble facile à mettre en œuvre, mais je ne suis pas sûr qu'il y ait des inconvénients cachés. Par exemple, je pense que WebSockets n'est supporté que par certains navigateurs. Les WebSockets présentent-ils d'autres inconvénients dont je devrais être conscient ?

Puisqu'il semble que les deux technologies font la même chose, dans quels types de scénarios préférerait-on utiliser l'une plutôt que l'autre ? Plus précisément, est-ce que les WebSockets HTML5 ont rendu AJAX long/short polling obsolète, ou y a-t-il des raisons impérieuses de préférer AJAX aux WebSockets ?

528voto

moka Points 6143

WebSockets est définitivement l'avenir maintenant.

L'interrogation longue est une solution de rechange sale pour éviter de créer des connexions pour chaque demande comme le fait AJAX - mais l'interrogation longue a été créée lorsque les WebSockets n'existaient pas. Maintenant, grâce aux WebSockets, l'interrogation longue est le départ pas plus.

WebRTC permet la communication de pair à pair.

Je recommande d'apprendre WebSockets .

Comparaison :

des différentes techniques de communication sur le web

  • AJAX - request response . Crée une connexion avec le serveur, envoie des en-têtes de requête avec des données facultatives, obtient une réponse du serveur et ferme la connexion. Pris en charge par tous les principaux navigateurs.

  • Long sondage - request wait response . Crée une connexion avec le serveur comme AJAX, mais maintient une connexion "keep-alive" ouverte pendant un certain temps (pas longtemps cependant). Pendant la connexion, le client ouvert peut recevoir des données du serveur. Le client doit se reconnecter périodiquement après la fermeture de la connexion, en raison des délais d'attente ou de l'absence de données. Du côté du serveur, il est toujours traité comme une demande HTTP, comme AJAX, sauf que la réponse à la demande se produira maintenant ou à un moment dans le futur, défini par la logique de l'application. tableau de soutien (complet) | _wikipedia_

  • WebSockets - client server . Créez une connexion TCP avec le serveur et laissez-la ouverte aussi longtemps que nécessaire. Le serveur ou le client peut facilement fermer la connexion. Le client passe par un processus de poignée de main compatible HTTP. S'il réussit, le serveur et le client peuvent échanger des données dans les deux sens à tout moment. Cette méthode est efficace si l'application nécessite un échange fréquent de données dans les deux sens. Les WebSockets disposent d'un encadrement des données qui comprend le masquage de chaque message envoyé du client au serveur, de sorte que les données sont simplement cryptées. tableau de soutien (très bon) | _wikipedia_

  • WebRTC - peer peer . Transport pour établir la communication entre les clients et est agnostique en matière de transport, il peut donc utiliser UDP, TCP ou même des couches plus abstraites. Il est généralement utilisé pour le transfert de gros volumes de données, comme le streaming vidéo/audio, où la fiabilité est secondaire et où quelques images ou une réduction de la progression de la qualité peuvent être sacrifiées en faveur du temps de réponse et, au moins, d'un certain transfert de données. Les deux parties (pairs) peuvent se transmettre des données de manière indépendante. Bien qu'il puisse être utilisé de manière totalement indépendante de tout serveur centralisé, il nécessite tout de même un moyen d'échanger les données des points d'extrémité, où dans la plupart des cas, les développeurs utilisent encore des serveurs centralisés pour "relier" les pairs. Cela n'est nécessaire que pour échanger les données essentielles à l'établissement d'une connexion, après quoi un serveur centralisé n'est plus nécessaire. tableau de support (moyen) | wikipedia

  • Événements envoyés par le serveur - client server . Le client établit une connexion persistante et à long terme avec le serveur. Seul le serveur peut envoyer des données à un client. Si le client veut envoyer des données au serveur, il doit utiliser une autre technologie/un autre protocole pour le faire. Ce protocole est compatible avec HTTP et simple à mettre en œuvre dans la plupart des plates-formes côté serveur. Il est préférable d'utiliser ce protocole à la place de Long Polling. carte de support (bonne, sauf IE) | _wikipedia_

Avantages :

Le principal avantage de WebSockets côté serveur, c'est qu'il ne s'agit pas d'une requête HTTP (après poignée de main), mais d'un véritable protocole de communication basé sur des messages. Ce vous permet d'obtenir d'énormes avantages en termes de performances et d'architecture . Par exemple, dans node.js, vous pouvez partager la même mémoire pour différentes connexions de socket, afin qu'elles puissent chacune accéder à des variables partagées. Par conséquent, vous n'avez pas besoin d'utiliser une base de données comme point d'échange au milieu (comme avec AJAX ou Long Polling avec un langage comme PHP). Vous pouvez stocker les données dans la RAM, ou même les republier directement entre les sockets.

Considérations relatives à la sécurité

Les gens s'inquiètent souvent de la sécurité des WebSockets. En réalité, il y a peu de différence, voire même une meilleure option pour les WebSockets. Tout d'abord, avec AJAX, il y a une plus grande probabilité de MITM car chaque demande est une nouvelle connexion TCP qui traverse l'infrastructure Internet. Avec les WebSockets, une fois la connexion établie, il est beaucoup plus difficile de l'intercepter entre les deux, avec un masquage de trame supplémentaire lorsque les données sont transmises en continu du client au serveur, ainsi qu'une compression supplémentaire, ce qui exige plus d'efforts pour sonder les données. Tous les protocoles modernes supportent les deux : HTTP et HTTPS (crypté).

P.S.

N'oubliez pas que les WebSockets ont généralement une approche très différente de la logique de mise en réseau. plus comme les jeux en temps réel l'ont fait pendant tout ce temps, et non comme le http.

1 votes

Dites-moi si je me trompe, mais même si WebSocket apporte de nombreuses améliorations, il ne recouvre pas complètement la fonctionnalité du polling long. Par exemple, vous ne pouvez pas simplement remplacer comet par websocket pour interroger une api REST.

15 votes

Il ne s'agit pas de compatibilité en soi. Le plus important est qu'il s'agit de repenser entièrement la façon dont la communication se déroule. Comme les API RESTful fonctionnent selon le modèle Demande>Réponse, la communication bidirectionnelle serait ici inutile. Ainsi, essayer d'utiliser des WebSockets pour interroger une API RESTful est une tentative un peu bizarre, et je ne vois pas du tout l'avantage qu'elle présente. Si vous avez besoin de données provenant d'une API RESTful, mais en temps réel, alors vous créez une API WebSockets pour pousser les données qui fonctionnera avec une communication bidirectionnelle comme les WebSockets. Vous essayez de comparer des choses sous un angle qui n'est pas comparable :)

1 votes

Est-ce que chaque connexion dans la WebSocket crée et utilise un thread sur le serveur ?

15voto

bmm6o Points 2692

Une technologie concurrente que vous avez omise est celle des événements envoyés par le serveur / Event Source. Que sont le sondage long, les Websockets, les événements envoyés par le serveur (SSE) et Comet ? propose une bonne discussion sur tous ces points. Gardez à l'esprit que certains d'entre eux sont plus faciles que d'autres à intégrer du côté serveur.

0 votes

Parmi toutes ces options, quelles sont celles que vous suggéreriez d'examiner ?

0 votes

J'ai eu du succès avec le long-polling, la seule astuce (pour cette technologie et d'autres) est de ne pas bloquer un fil de serveur. Si vous n'utilisez pas un code serveur asynchrone, cela ne fonctionnera pas.

1 votes

@somdow Maksims-Mihejevs a joliment répondu à votre question dans les deux premiers paragraphes de sa réponse. Utilisez les websockets.

8voto

Brant Olsen Points 2642

Pour les applications de chat ou toute autre application qui est en conversation constante avec le serveur, WebSockets sont la meilleure option. Cependant, vous ne pouvez utiliser WebSockets avec un serveur qui les prend en charge, ce qui peut limiter votre capacité à les utiliser si vous ne pouvez pas installer les bibliothèques requises. Dans ce cas, vous devrez utiliser Long Polling pour obtenir une fonctionnalité similaire.

5 votes

Les WebSockets sont supportés par tous les serveurs... Il suffit d'installer node.js ou quelque chose de similaire.

9 votes

Modifié un peu pour expliquer que oui, tout serveur supporte les WebSockets. Cependant, si vous utilisez un service d'hébergement, il se peut que vous ne puissiez pas les utiliser.

0 votes

Je réalise que ce fil est un peu vieux mais... Les WebSockets ne sont peut-être pas la meilleure solution pour toutes les communications bidirectionnelles. J'ai récemment remarqué que la documentation relative à la prise en charge des sockets Web de Spring 4 suggère que les WebSockets sont mieux adaptées au déplacement de grandes quantités de données ou à une faible latence. Si ces éléments ne sont pas applicables ou ne sont pas une priorité, je crois qu'ils suggèrent d'utiliser le polling long. Je ne connais pas la justification complète de ce point de vue, je me suis juste dit que les gens de Spring savent de quoi ils parlent en général.

3voto

JSON C11 Points 3146

XHR polling vs SSE vs WebSockets

  • Polling XHR Une demande est traitée lorsque l'événement se produit (immédiatement ou après un délai). Des demandes ultérieures devront être faites pour recevoir d'autres événements.

    Le navigateur fait une demande asynchrone au serveur, qui peut attendre que les données soient disponibles avant de répondre. La réponse de réponse peut contenir des données codées (typiquement XML ou JSON) ou du Javascript à exécuter par le client. du Javascript à exécuter par le client. A la fin du traitement de la réponse, le navigateur crée et envoie un autre XHR, pour attendre l'événement suivant. Ainsi, le navigateur garde toujours une demande en suspens auprès du serveur, pour qu'il y réponde à chaque événement. Wikipedia

  • Événements envoyés par le serveur Le client envoie une demande au serveur. Le serveur envoie de nouvelles données à la page web à tout moment.

    Traditionnellement, une page web doit envoyer une requête au serveur pour recevoir de nouvelles données ; autrement dit, la page demande des données au serveur. Avec les événements envoyés par le serveur, il est possible pour un serveur d'envoyer de nouvelles données à une page Web à tout moment, en envoyant des messages à la page Web. Ces messages entrants peuvent être traités comme des événements + données dans la page Web. Mozilla

  • WebSockets Après la poignée de main initiale (via le protocole HTTP). La communication se fait de manière bidirectionnelle en utilisant le protocole WebSocket.

    La poignée de main commence par une demande/réponse HTTP, ce qui permet aux serveurs de gérer des connexions HTTP ainsi que des connexions WebSocket sur le même même port. Une fois la connexion établie, la communication passe à un protocole binaire bidirectionnel qui n'est pas conforme au protocole HTTP. qui n'est pas conforme au protocole HTTP. Wikipedia

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X