web-dev-qa-db-fra.com

HTML WebSockets maintient-il une connexion ouverte pour chaque client? Est-ce que cette échelle?

Je suis curieux de savoir si quelqu'un a des informations sur l'évolutivité de HTML WebSockets. Pour tout ce que j'ai lu, il semble que chaque client maintiendra une ligne de communication ouverte avec le serveur. Je me demande simplement comment cela évolue et combien de connexions WebSocket ouvertes un serveur peut gérer. Peut-être que laisser ces connexions ouvertes n’est pas un problème en réalité, mais on a l’impression que c’est.

151
Ryan Montgomery

Dans la plupart des cas, les WebSockets seront probablement mieux dimensionnés que les requêtes AJAX/HTML. Toutefois, cela ne signifie pas que WebSockets remplace toutes les utilisations d'AJAX/HTML.

Chaque connexion TCP ne consomme que très peu de ressources serveur. La configuration de la connexion peut souvent être coûteuse, mais le maintien d'une connexion inactive est presque libre. La première limitation généralement rencontrée est le maximum nombre de descripteurs de fichier (les sockets consomment des descripteurs de fichier) pouvant être ouverts simultanément. Ce nombre par défaut est souvent 1024 mais peut facilement être configuré plus haut.

Avez-vous déjà essayé de configurer un serveur Web pour prendre en charge des dizaines de milliers de clients simultanés? AJAX? Changez ces clients en clients WebSockets et cela pourrait être réalisable.

Les connexions HTTP, bien qu'elles ne créent pas de fichiers ouverts ou ne consomment pas de numéros de port pendant une longue période, sont plus chères à peu près toutes les autres manières:

  • Chaque connexion HTTP contient beaucoup de bagages qui ne sont pas utilisés la plupart du temps: cookies, type de contenu, longueur du contenu, agent utilisateur, identifiant du serveur, date, dernière modification, etc. Une fois la connexion WebSockets établie, seul le les données requises par l'application doivent être échangées.

  • En règle générale, les serveurs HTTP sont configurés pour enregistrer le début et la fin de chaque requête HTTP prenant du temps sur le disque et le processeur. Il deviendra standard d'enregistrer le début et la fin des données WebSockets, mais pendant que la connexion WebSockets effectuera un transfert en duplex, il n'y aura pas de surcharge de journalisation supplémentaire (sauf par l'application/service si elle est conçue pour le faire).

  • En règle générale, les applications interactives qui utilisent AJAX interrogent en continu ou utilisent une sorte de mécanisme d’enquête longue. WebSockets est un moyen beaucoup plus propre (et moins gourmand en ressources) de créer un modèle plus événementiel Le serveur et le client s'informent mutuellement lorsqu'ils ont quelque chose à signaler via la connexion existante.

  • La plupart des serveurs Web populaires en production disposent d'un pool de processus (ou threads) permettant de gérer les requêtes HTTP. À mesure que la pression augmente, la taille du pool augmente car chaque processus/thread traite une requête HTTP à la fois. Chaque processus/thread supplémentaire utilise plus de mémoire et la création de nouveaux processus/threads coûte un peu plus cher que la création de nouvelles connexions de sockets (ce que ces processus/threads doivent encore faire). La plupart des infrastructures de serveur WebSockets populaires suivent le même itinéraire qu'un événement qui tend à évoluer et à obtenir de meilleures performances.

Les principaux avantages de WebSockets seront les connexions à faible temps de latence pour les applications Web interactives. Elle évoluera mieux et consommera moins de ressources serveur que HTTP AJAX/long-poll (en supposant que l'application/serveur est conçue correctement), mais une latence inférieure d'IMO est le principal avantage de WebSockets car elle permet de nouvelles classes d'applications Web impossibles à obtenir. avec l'overhead actuel et la latence d'AJAX/long-poll.

Une fois que le standard WebSockets sera plus finalisé et bénéficiera d’un support plus large, il sera logique de l’utiliser pour la plupart des nouvelles applications Web interactives nécessitant une communication fréquente avec le serveur. Pour les applications Web interactives existantes, cela dépendra réellement de l'efficacité du modèle actuel AJAX/long-poll. L'effort de conversion sera non négligeable, de sorte que dans de nombreux cas, le coût n'en vaut tout simplement pas la peine.

Mise à jour :

Lien utile: 600 000 connexions Websocket simultanées sur AWS à l'aide de Node.js

198
kanaka

Juste une précision: le nombre de connexions client qu'un serveur peut prendre en charge n'a aucun rapport avec les ports dans ce scénario, car le serveur n'écoute [généralement] que des connexions WS/WSS sur un seul port. Je pense que ce que les autres commentateurs voulaient dire étaient des descripteurs de fichiers. Vous pouvez définir un nombre maximum de descripteurs de fichier assez élevé, mais vous devez ensuite faire attention aux tailles de mémoire tampon de socket qui s’additionnent pour chaque socket TCP/IP ouvert. Voici quelques informations supplémentaires: https://serverfault.com/questions/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system

En ce qui concerne la latence réduite via WS par rapport à HTTP, c'est vrai puisqu'il n'y a plus d'analyse d'en-têtes HTTP au-delà de la négociation WS initiale. De plus, comme de plus en plus de paquets sont envoyés avec succès, la fenêtre d’encombrement TCP) s’est élargie, ce qui a pour effet de réduire le RTT.

35
Michael

Tout serveur simple moderne est capable de serveur des milliers de clients à la fois . Son logiciel de serveur HTTP doit juste être orienté Event-Driven (IOCP) (nous ne sommes plus dans l’ancien Apache, une seule connexion = une équation thread/processus). Même le serveur HTTP intégré à Windows (http.sys) est orienté IOCP et très efficace (fonctionnant en mode noyau). De ce point de vue, il n'y aura pas beaucoup de différence en termes de dimensionnement entre WebSockets et une connexion HTTP classique. Une connexion TCP/IP utilise peu de ressources (beaucoup moins qu'un thread) et les systèmes d’exploitation modernes sont optimisés pour la gestion de nombreuses connexions simultanées: WebSockets et HTTP ne sont que des protocoles de couche d’application OSI 7, hérités de ces spécifications TCP/IP.

Mais expérimentalement, j'ai constaté deux problèmes principaux avec WebSockets:

  1. Ils ne supportent pas CDN;
  2. Ils ont des problèmes de sécurité potentiels.

Je recommanderais donc ce qui suit pour tout projet:

  • Utilisez WebSockets pour les notifications client uniquement (avec un mécanisme de secours en longue interrogation - il y a beaucoup de bibliothèques autour);
  • Utilisez RESTful/JSON pour toutes les autres données, en utilisant un CDN ou des serveurs proxy pour le cache.

En pratique, les applications WebSockets complètes ne sont pas bien adaptées. Il suffit d’utiliser WebSockets pour ce à quoi ils ont été conçus: envoyer des notifications du serveur au client.

À propos des problèmes potentiels liés à l'utilisation de WebSockets:

1. Pensez à utiliser un CDN

Aujourd'hui (presque 4 ans plus tard), la mise à l'échelle Web implique l'utilisation de frontaux Content Delivery Network (CDN), non seulement pour le contenu statique (html, css, js) mais aussi votre (JSON) données d'application .

Bien sûr, vous ne placerez pas toutes vos données dans votre cache CDN, mais dans la pratique, beaucoup de contenu commun ne changera pas souvent. Je soupçonne que 80% de vos REST ressources peuvent être mises en cache ... Même une une minute (ou 30 secondes ) Le délai d’expiration CDN peut suffire à donner un nouveau live à votre serveur central et à améliorer considérablement la réactivité de l’application, car le CDN peut être réglé géographiquement ...

À ma connaissance, CDN ne prend pas encore en charge WebSockets et je suppose que cela ne le sera jamais. Les WebSockets sont statefull, alors que HTTP est sans état, donc beaucoup plus facilement mis en cache. En fait, pour rendre WebSockets compatible avec le CDN, vous devrez peut-être adopter une approche RESTful sans état… qui ne serait plus du tout WebSockets.

2. Problèmes de sécurité

Les WebSockets présentent des problèmes de sécurité potentiels, notamment en ce qui concerne les attaques par DOS. Pour une illustration des nouvelles vulnérabilités de sécurité, voir cet ensemble de diapositives et ce ticket webkit .

Les WebSockets évitent toute possibilité d'inspection des paquets au niveau de la couche d'application OSI 7, qui devient aujourd'hui un standard pour toute sécurité d'entreprise. En fait, WebSockets rend la transmission obscurcie et peut donc constituer une violation majeure de la fuite de sécurité.

13
Arnaud Bouchez

Pensez-y de la façon suivante: ce qui est moins cher, le maintien d’une connexion ouverte ou l’ouverture d’une nouvelle connexion pour chaque demande (avec la surcharge de la négociation, rappelez-vous qu’il s’agit de TCP).

Bien sûr, cela dépend de l'application, mais pour les connexions en temps réel à long terme (par exemple, un AJAX chat)), il est de loin préférable de garder la connexion ouverte.

Le nombre maximal de connexions sera limité par le nombre maximal de ports libres pour les sockets.

8
kaoD