Dans quelles situations l'interrogation AJAX longue / courte serait-elle préférée aux HTML5 WebSockets?

306

Je crée une petite application de chat pour des amis, mais je ne sais pas comment obtenir des informations en temps opportun qui ne sont pas aussi manuelles ou aussi rudimentaires que de forcer une actualisation de page.

Actuellement, je l'implémente en utilisant AJAX simple, mais cela a l'inconvénient de frapper régulièrement le serveur quand un court délai s'écoule.

En recherchant des sondages longs / courts, j'ai parcouru HTML5 WebSockets. Cela semble facile à mettre en œuvre, mais je ne sais pas s'il y a des inconvénients cachés. Par exemple, je pense que WebSockets n'est pris en charge que par certains navigateurs. Y a-t-il d'autres inconvénients aux WebSockets 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, HTML5 WebSockets a-t-il rendu obsolètes les interrogations longues / courtes AJAX, ou existe-t-il des raisons impérieuses de préférer AJAX aux WebSockets?

somdow
la source

Réponses:

508

WebSockets est définitivement l'avenir.

L'interrogation longue est une solution de contournement pour éviter de créer des connexions pour chaque demande comme AJAX - mais l'interrogation longue a été créée lorsque les WebSockets n'existaient pas. Maintenant, grâce aux WebSockets, les longs sondages disparaissent.

WebRTC permet la communication d'égal à égal.

Je recommande d'apprendre WebSockets .

Comparaison:

de différentes techniques de communication sur le web

  • AJAX - requestresponse. Crée une connexion au serveur, envoie des en-têtes de demande avec des données facultatives, obtient une réponse du serveur et ferme la connexion. Pris en charge dans tous les principaux navigateurs.

  • Sondage long - requestwaitresponse. Crée une connexion au serveur comme le fait AJAX, mais maintient une connexion permanente 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 de délais d'attente ou de données eof. Côté serveur, elle est toujours traitée comme une requête HTTP, comme AJAX, sauf que la réponse sur demande se produira maintenant ou dans le futur, définie par la logique de l'application. tableau de support (complet) | Wikipédia

  • WebSockets - clientserver. Créez une connexion TCP au 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 prise de contact compatible HTTP. S'il réussit, le serveur et le client peuvent à tout moment échanger des données dans les deux sens. Il est efficace si l'application nécessite un échange de données fréquent dans les deux sens. Les WebSockets ont un encadrement des données qui inclut un masquage pour chaque message envoyé du client au serveur, donc les données sont simplement chiffrées. tableau de support (très bon) | Wikipédia

  • WebRTC - peertableau de support (moyen) | Wikipédiapeer . Le transport pour établir la communication entre les clients et est indépendant du transport, il peut donc utiliser des couches UDP, TCP ou encore plus abstraites. Ceci est généralement utilisé pour le transfert de données à haut volume, comme le streaming vidéo / audio, où la fiabilité est secondaire et quelques images ou la réduction de la progression de la qualité peuvent être sacrifiées en faveur du temps de réponse et, au moins, certains transferts de données. Les deux côtés (homologues) peuvent se transmettre des données indépendamment. Bien qu'il puisse être utilisé de manière totalement indépendante de tout serveur centralisé, il nécessite toujours un moyen d'échanger des données de points d'extrémité, où dans la plupart des cas, les développeurs utilisent toujours des serveurs centralisés pour «lier» leurs homologues. Cela n'est nécessaire que pour échanger des données essentielles pour établir une connexion, après quoi un serveur centralisé n'est pas nécessaire.

  • Événements envoyés par le serveur - clientserver. 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 souhaite envoyer des données au serveur, il faudrait pour cela utiliser une autre technologie / protocole. Ce protocole est compatible HTTP et simple à implémenter dans la plupart des plateformes côté serveur. Il s'agit d'un protocole préférable à utiliser au lieu de l'interrogation longue. graphique de support (bon, sauf IE) | Wikipédia

Avantages:

Le principal avantage de WebSockets côté serveur, c'est qu'il ne s'agit pas d'une requête HTTP (après la prise de contact), mais d'un protocole de communication basé sur les messages approprié. Cela 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'ils puissent chacun accéder aux 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 des données dans la RAM, ou même republier immédiatement entre les sockets.

Considérations de sécurité

Les gens sont souvent préoccupés par la sécurité des WebSockets. La réalité est que cela fait peu de différence ou même met WebSockets comme meilleure option. Tout d'abord, avec AJAX, les chances de MITM sont plus élevées , car chaque demande est une nouvelle connexion TCP qui traverse l'infrastructure Internet. Avec WebSockets, une fois connecté, il est beaucoup plus difficile d'intercepter entre les deux, avec un masquage de trame supplémentaire lorsque les données sont transmises du client au serveur ainsi qu'une compression supplémentaire, qui nécessite plus d'efforts pour sonder les données. Tous les protocoles modernes prennent en charge à la fois: HTTP et HTTPS (crypté).

PS

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 avaient tout ce temps, et pas comme http.

moka
la source
15
Il ne s'agit pas de compatibilité elle-même. Plus important encore, il est sur le point de repenser complètement la manière dont la communication se déroule. Comme les API RESTful fonctionnent avec le modèle Requête> Réponse, la communication bidirectionnelle serait ici inutile. Donc, essayer d'utiliser WebSockets pour interroger l'API RESTful - est une tentative un peu étrange et ne peut en voir aucun avantage. Si vous avez besoin de données de l'API RESTful mais en temps réel, vous créez une API WebSockets pour envoyer des données qui fonctionneront avec une communication bidirectionnelle comme WebSockets. Vous essayez de comparer des choses sous un angle qui ne sont pas comparables :)
moka
2
Salut @pithhelmet tout dépend du logiciel côté serveur (langue / technologie) lui-même. WebSocket est une couche sur TCP, et il existe de nombreuses façons d'effectuer des implémentations de flux TCP. Les serveurs Web modernes utilisent une architecture basée sur les événements et sont très efficaces avec les pools de threads. Quelle technologie utilisez-vous? Node.js utilise des événements en arrière-plan pour IO et des événements avec un seul thread dans le contexte d'exécution, il est donc incroyablement efficace. L'utilisation de thread pour chaque connexion - est très inefficace en termes de RAM (1 Mo + par thread) ainsi que de CPU, car ces threads seront simplement inactifs ou pire - boucle infinie de vérification des données.
moka
4
L'interrogation longue n'est pas une solution de contournement sale, et elle est différente de webSocket. Ces deux sont destinés à être utilisés dans des scénarios différents.
bagz_man
5
@bagz_man Long Polling est une utilisation "hacky" de la technologie pour obtenir des résultats que la technologie ne permettait pas par définition et qu'aucune alternative standard n'était disponible. La raison pour laquelle Long Polling existe est exactement le fait que WS n'a pas existé, point.
moka
4
@moka: le niveau gratuit de Cloudflare absorbera une attaque soutenue de 400 + Gbps. Votre portefeuille peut-il absorber la facture AWS? AWS et Cloudflare ont également des vues opposées en ce qui concerne le traitement des plaintes contre votre origine. C'est juste quelque chose à garder à l'esprit tant que nous discutons des compromis. :)
danneu
11

Une technologie rivale que vous avez omise est Événements envoyés par le serveur / Source d'événement. Que sont les appels longs, les Websockets, les événements envoyés par le serveur (SSE) et Comet? a une bonne discussion de tous ces éléments. Gardez à l'esprit que certains d'entre eux sont plus faciles à intégrer que du côté serveur.

bmm6o
la source
De tout cela, quel conseil suggéreriez-vous d'étudier?
somdow
J'ai eu du succès avec l'interrogation longue, la seule astuce (pour elle et pour d'autres technologies) n'est pas de bloquer un thread de serveur. Si vous n'utilisez pas de code de serveur asynchrone, il ne sera pas mis à l'échelle.
bmm6o
1
@somdow Maksims-Mihejevs a bien répondu à votre question dans les deux premiers paragraphes de sa réponse. Utilisez des websockets.
Jeff Sheffield
7

Pour les applications de chat ou toute autre application qui est en conversation constante avec le serveur, WebSocketssont la meilleure option. Cependant, vous ne pouvez l'utiliser WebSocketsqu'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 Pollingpour obtenir des fonctionnalités similaires.

Brant Olsen
la source
5
Les WebSockets sont pris en charge par tous les serveurs ... Il vous suffit d'installer node.js ou quelque chose de similaire.
noob
9
Ajusté un peu pour expliquer que oui, n'importe quel serveur prendra en charge les WebSockets. Cependant, si vous utilisez un service d'hébergement, vous ne pourrez peut-être pas les utiliser.
Brant Olsen
Je me rends compte que ce fil est un peu vieux mais ... WebSockets n'est peut-être pas la meilleure réponse pour toutes les communications bidirectionnelles. J'ai récemment remarqué que la documentation pour la prise en charge des sockets Web de Spring 4 suggère que les WebSockets sont mieux adaptés pour déplacer de grandes quantités de données ou une faible latence. Si ceux-ci ne sont pas applicables ou ne sont pas une priorité, je pense qu'ils suggèrent d'utiliser un sondage long. Je ne connais pas la justification complète de ce point de vue, je pensais juste que les gens du printemps savent de quoi ils parlent en général.
Stoney
1
@Stoney mis à part le fait que vous auriez besoin d'installer websocket sur le serveur (gestionnaires, etc.) Il n'y a tout simplement aucune raison d'utiliser l'interrogation longue sur websocket. Websocket est beaucoup plus rapide (faible latence) et permet au serveur de «parler» au client sans que le client le lui demande. Aujourd'hui, j'utilise signalr (l'une des meilleures implémentations de websocket jamais réalisée à mon avis - il fonctionne sur le client et le serveur et permet au client d'appeler des méthodes sur le serveur et le serveur sur le client comme s'il n'y avait pas de différence) sur chaque site web que je fais - chargement de contenu dynamique, pages sans fond, etc.
DividedByZero
0

Sondage XHR vs SSE vs WebSockets

  • Interrogation XHR Une demande reçoit une réponse lorsque l'événement se produit (peut être 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 du serveur, qui peut attendre que les données soient disponibles avant de répondre. La réponse peut contenir des données codées (généralement XML ou JSON) ou Javascript à exécuter par le client. A la fin du traitement de la réponse, le navigateur crée et envoie un autre XHR, en attendant le prochain événement. Ainsi, le navigateur conserve toujours une demande en suspens avec le serveur, à laquelle il faut répondre à chaque événement. Wikipédia

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

    Traditionnellement, une page Web doit envoyer une demande au serveur pour recevoir de nouvelles données; c'est-à-dire que 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 poussant des messages vers la page Web. Ces messages entrants peuvent être traités comme des événements + des données dans la page Web. Mozilla

  • WebSockets Après la négociation initiale (via le protocole HTTP). La communication se fait bidirectionnellement en utilisant le protocole WebSocket.

    La prise de contact commence par une demande / réponse HTTP, permettant aux serveurs de gérer les connexions HTTP ainsi que les connexions WebSocket sur le même port. Une fois la connexion établie, la communication bascule vers un protocole binaire bidirectionnel non conforme au protocole HTTP. Wikipédia

JSON C11
la source