In welchen Situationen würde AJAX Long / Short Polling HTML5 WebSockets vorgezogen?

306

Ich erstelle eine kleine Chat-Anwendung für Freunde, bin mir aber nicht sicher, wie ich Informationen rechtzeitig abrufen kann, die nicht so manuell oder rudimentär sind wie das Erzwingen einer Seitenaktualisierung.

Derzeit implementiere ich dies mit einfachem AJAX, aber dies hat den Nachteil, dass ich regelmäßig auf den Server treffe, wenn ein kurzer Timer verstrichen ist.

Bei der Untersuchung von langen / kurzen Abfragen bin ich auf HTML5-WebSockets gestoßen. Dies scheint einfach zu implementieren zu sein, aber ich bin mir nicht sicher, ob es einige versteckte Nachteile gibt. Ich denke zum Beispiel, dass WebSockets nur von bestimmten Browsern unterstützt wird. Gibt es andere Nachteile von WebSockets, die ich beachten sollte?

Da es so aussieht, als ob beide Technologien dasselbe tun, in welchen Szenarien würde man es vorziehen, eines über das andere zu verwenden? Hat HTML5 WebSockets AJAX Long / Short Polling überflüssig gemacht, oder gibt es zwingende Gründe, AJAX WebSockets vorzuziehen?

Somdow
quelle

Antworten:

508

WebSockets ist definitiv die Zukunft.

Lange Abfragen sind eine schmutzige Problemumgehung, um zu verhindern, dass wie bei AJAX Verbindungen für jede Anforderung erstellt werden. Lange Abfragen wurden jedoch erstellt, wenn WebSockets nicht vorhanden waren. Aufgrund von WebSockets verschwinden jetzt lange Abfragen.

WebRTC ermöglicht Peer-to-Peer-Kommunikation.

Ich empfehle, WebSockets zu lernen .

Vergleich:

von verschiedenen Kommunikationstechniken im Web

  • AJAX - requestresponse. Erstellt eine Verbindung zum Server, sendet Anforderungsheader mit optionalen Daten, erhält eine Antwort vom Server und schließt die Verbindung. Wird in allen gängigen Browsern unterstützt.

  • Lange Umfrage - requestwaitresponse. Erstellt eine Verbindung zum Server wie AJAX, hält jedoch eine Keep-Alive-Verbindung für einige Zeit offen (allerdings nicht lange). Während der Verbindung kann der offene Client Daten vom Server empfangen. Der Client muss die Verbindung regelmäßig wieder herstellen, nachdem die Verbindung aufgrund von Zeitüberschreitungen oder Datenausfällen geschlossen wurde. Auf der Serverseite wird es wie AJAX weiterhin wie eine HTTP-Anforderung behandelt, mit der Ausnahme, dass die Antwort auf Anforderung jetzt oder zu einem späteren Zeitpunkt in der Anwendungslogik erfolgt. Unterstützungsdiagramm (vollständig) | Wikipedia

  • WebSockets - clientserver. Erstellen Sie eine TCP-Verbindung zum Server und lassen Sie diese so lange wie nötig geöffnet. Der Server oder Client kann die Verbindung problemlos schließen. Der Client durchläuft einen HTTP-kompatiblen Handshake-Prozess. Wenn dies erfolgreich ist, können Server und Client jederzeit Daten in beide Richtungen austauschen. Es ist effizient, wenn die Anwendung einen häufigen Datenaustausch auf beide Arten erfordert. WebSockets verfügen über einen Datenrahmen, der eine Maskierung für jede vom Client an den Server gesendete Nachricht umfasst, sodass Daten einfach verschlüsselt werden. Unterstützungsdiagramm (sehr gut) | Wikipedia

  • WebRTC - peerpeer. Transport zum Herstellen der Kommunikation zwischen Clients und transportunabhängig, sodass UDP, TCP oder noch abstraktere Schichten verwendet werden können. Dies wird im Allgemeinen für die Datenübertragung mit hohem Datenvolumen verwendet, z. B. für Video- / Audio-Streaming, bei dem die Zuverlässigkeit zweitrangig ist und einige Frames oder eine Verringerung des Qualitätsfortschritts zugunsten der Antwortzeit und zumindest einer gewissen Datenübertragung geopfert werden können. Beide Seiten (Peers) können Daten unabhängig voneinander aneinander übertragen. Obwohl es völlig unabhängig von zentralisierten Servern verwendet werden kann, erfordert es dennoch eine Möglichkeit zum Austausch von EndPoints-Daten, wobei Entwickler in den meisten Fällen immer noch zentralisierte Server verwenden, um Peers zu "verknüpfen". Dies ist nur erforderlich, um wichtige Daten für den Verbindungsaufbau auszutauschen. Danach ist kein zentraler Server mehr erforderlich. Unterstützungsdiagramm (mittel) | Wikipedia

  • Vom Server gesendete Ereignisse - clientserver. Der Client stellt eine dauerhafte und langfristige Verbindung zum Server her. Nur der Server kann Daten an einen Client senden. Wenn der Client Daten an den Server senden möchte, muss dazu eine andere Technologie / ein anderes Protokoll verwendet werden. Dieses Protokoll ist HTTP-kompatibel und auf den meisten serverseitigen Plattformen einfach zu implementieren. Dies ist ein bevorzugtes Protokoll, das anstelle von Long Polling verwendet wird. Support-Diagramm (gut, außer IE) | Wikipedia

Vorteile:

Der Hauptvorteil der serverseitigen WebSockets besteht darin, dass es sich nicht um eine HTTP-Anforderung (nach dem Handshake) handelt, sondern um ein ordnungsgemäßes nachrichtenbasiertes Kommunikationsprotokoll. Auf diese Weise können Sie enorme Leistungs- und Architekturvorteile erzielen . In node.js können Sie beispielsweise denselben Speicher für verschiedene Socket-Verbindungen gemeinsam nutzen, sodass diese jeweils auf gemeinsam genutzte Variablen zugreifen können. Daher müssen Sie keine Datenbank als Austauschpunkt in der Mitte verwenden (wie bei AJAX oder Long Polling mit einer Sprache wie PHP). Sie können Daten im RAM speichern oder sogar sofort zwischen den Sockets erneut veröffentlichen.

Sicherheitsüberlegungen

Menschen sind oft besorgt über die Sicherheit von WebSockets. Die Realität ist, dass es kaum einen Unterschied macht oder sogar WebSockets als bessere Option darstellt. Erstens besteht bei AJAX eine höhere Wahrscheinlichkeit für MITM , da jede Anforderung eine neue TCP-Verbindung ist, die über die Internetinfrastruktur geleitet wird. Bei WebSockets ist es nach dem Verbinden weitaus schwieriger, dazwischen abzufangen. Zusätzlich wird eine Frame-Maskierung erzwungen, wenn Daten vom Client zum Server gestreamt werden, sowie eine zusätzliche Komprimierung, die mehr Aufwand für die Datenprüfung erfordert. Alle modernen Protokolle unterstützen sowohl: HTTP als auch HTTPS (verschlüsselt).

PS

Denken Sie daran, dass WebSockets im Allgemeinen einen ganz anderen logischen Ansatz für das Networking verfolgen , eher wie Echtzeitspiele die ganze Zeit und nicht wie http.

Moka
quelle
15
Es geht nicht um Kompatibilität. Am wichtigsten ist, dass die Art und Weise der Kommunikation völlig neu überdacht wird. Da RESTful-APIs mit dem Muster Request> Response arbeiten, wäre eine bidirektionale Kommunikation hier sinnlos. Der Versuch, WebSockets zum Abfragen der RESTful-API zu verwenden, ist also ein etwas seltsamer Versuch und kann überhaupt keinen Nutzen daraus ziehen. Wenn Sie Daten von der RESTful-API benötigen, jedoch in Echtzeit, erstellen Sie eine WebSockets-API, um Daten zu übertragen, die mit bidirektionaler Kommunikation wie WebSockets funktionieren. Sie versuchen, Dinge in einem Winkel zu vergleichen, der nicht vergleichbar ist :)
Moka
2
Hi @pithhelmet alles hängt von der serverseitigen Software (Sprache / Technik) selbst ab. WebSocket ist eine Schicht über TCP, und es gibt viele Möglichkeiten, TCP-Stream-Implementierungen durchzuführen. Moderne Webserver verwenden eine ereignisbasierte Architektur und sind mit Thread-Pools sehr effizient. Welche Technologie verwenden Sie? Node.js verwendet Ereignisse hinter den Kulissen für E / A und Ereignisse mit einem einzelnen Thread im Ausführungskontext, sodass es erstaunlich effizient ist. Die Verwendung von Threads für jede Verbindung - ist sowohl in Bezug auf RAM (1 MB + pro Thread) als auch in Bezug auf die CPU sehr ineffizient, da diese Threads nur inaktiv oder schlechter sind - Endlosschleife für die Überprüfung auf Daten.
Moka
4
Lange Abfragen sind keine schmutzige Problemumgehung und unterscheiden sich von webSocket. Diese beiden sollen in verschiedenen Szenarien verwendet werden.
bagz_man
5
@bagz_man Long Polling ist ein "hackiger" Einsatz von Technologie, um Ergebnisse zu erzielen, die per Definition nicht zulässig waren und für die keine Standardalternative verfügbar war. Der Grund, warum Long Polling existiert, ist genau die Tatsache, dass WS dies nicht getan hat, Punkt.
Moka
4
@moka: Cloudflares Free-Tier absorbiert einen anhaltenden Angriff mit mehr als 400 Gbit / s. Kann Ihre Brieftasche die AWS-Rechnung aufnehmen? Auch AWS und Cloudflare haben unterschiedliche Ansichten, wenn es um Beschwerden gegen Ihre Herkunft geht. Es ist nur etwas zu beachten, solange wir die Kompromisse diskutieren. :)
danneu
11

Eine konkurrierende Technologie, die Sie ausgelassen haben, ist Server-Sent Events / Event Source. Was sind Long Polling, Websockets, Server-Sent Events (SSE) und Comet? hat eine gute Diskussion über all dies. Beachten Sie, dass einige davon auf der Serverseite einfacher zu integrieren sind als andere.

bmm6o
quelle
Was würden Sie von all diesen vorschlagen?
Irgendwann
Ich hatte Erfolg mit langen Abfragen. Der einzige Trick (für sie und andere Technologien) besteht darin, keinen Server-Thread zu binden. Wenn Sie keinen asynchronen Servercode verwenden, wird dieser nicht skaliert.
Bmm6o
1
@somdow Maksims-Mihejevs hat Ihre Frage in den ersten beiden Absätzen seiner Antwort gut beantwortet. Verwenden Sie Websockets.
Jeff Sheffield
7

Für Chat-Anwendungen oder andere Anwendungen, die in ständiger Konversation mit dem Server stehen, WebSocketsist dies die beste Option. Sie können sie jedoch nur WebSocketsmit einem Server verwenden, der sie unterstützt. Dies kann Ihre Verwendung einschränken, wenn Sie die erforderlichen Bibliotheken nicht installieren können. In diesem Fall müssten Sie verwenden Long Polling, um ähnliche Funktionen zu erhalten.

Brant Olsen
quelle
5
WebSockets werden von jedem Server unterstützt ... Sie müssen nur node.js oder ähnliches installieren.
Noob
9
Es wurde ein wenig optimiert, um zu erklären, dass ja jeder Server WebSockets unterstützt. Wenn Sie jedoch einen Hosting-Service verwenden, können Sie diese möglicherweise nicht verwenden.
Brant Olsen
Mir ist klar, dass dieser Thread etwas alt ist, aber ... WebSockets sind möglicherweise nicht die beste Antwort für alle bidirektionalen Kommunikationen. Ich habe kürzlich festgestellt, dass die Dokumentation zur Unterstützung von Spring 4-Web-Sockets darauf hindeutet, dass WebSockets besser zum Verschieben großer Datenmengen oder geringer Latenz geeignet sind. Wenn diese nicht zutreffen oder keine Priorität haben, schlagen sie meines Erachtens die Verwendung langer Abstimmungen vor. Ich kenne nicht die vollständige Rechtfertigung für diese Ansicht, ich dachte nur, die Frühlingsleute wissen, wovon sie im Allgemeinen sprechen.
Stoney
1
@Stoney abgesehen von der Tatsache, dass Sie Websocket auf dem Server einrichten müssten (Handler usw.) Es gibt einfach keinen Grund, Long Polling über Websocket zu verwenden. Websocket ist viel schneller (geringe Latenz) und ermöglicht es dem Server, mit dem Client zu "sprechen", ohne dass der Client dies verlangt. Heutzutage verwende ich signalr (eine der besten Implementierungen von Websocket, die meiner Meinung nach jemals gemacht wurden - es läuft auf dem Client und dem Server und ermöglicht es dem Client, Methoden auf dem Server und den Server auf dem Client aufzurufen, als ob es keinen Unterschied gibt) Website, die ich mache - dynamisches Laden von Inhalten, bodenlose Seiten usw.
DividedByZero
0

XHR-Abfrage vs SSE vs WebSockets

  • XHR-Abfrage Eine Anfrage wird beantwortet, wenn das Ereignis eintritt (kann sofort oder nach einer Verzögerung erfolgen). Nachfolgende Anfragen müssen gestellt werden, um weitere Ereignisse zu erhalten.

    Der Browser sendet eine asynchrone Anforderung an den Server, die möglicherweise darauf wartet, dass Daten verfügbar sind, bevor sie antworten. Die Antwort kann codierte Daten (normalerweise XML oder JSON) oder Javascript enthalten, die vom Client ausgeführt werden sollen. Am Ende der Verarbeitung der Antwort erstellt und sendet der Browser eine weitere XHR, um auf das nächste Ereignis zu warten. Somit hält der Browser immer eine ausstehende Anfrage beim Server, die bei jedem Ereignis beantwortet werden muss. Wikipedia

  • Vom Server gesendete Ereignisse Der Client sendet eine Anfrage an den Server. Der Server sendet jederzeit neue Daten an die Webseite.

    Traditionell muss eine Webseite eine Anfrage an den Server senden, um neue Daten zu empfangen. Das heißt, die Seite fordert Daten vom Server an. Bei vom Server gesendeten Ereignissen kann ein Server jederzeit neue Daten an eine Webseite senden, indem er Nachrichten an die Webseite sendet. Diese eingehenden Nachrichten können innerhalb der Webseite als Ereignisse + Daten behandelt werden. Mozilla

  • WebSockets Nach dem ersten Handshake (über das HTTP-Protokoll). Die Kommunikation erfolgt bidirektional über das WebSocket-Protokoll.

    Der Handshake beginnt mit einer HTTP-Anforderung / Antwort, sodass Server sowohl HTTP-Verbindungen als auch WebSocket-Verbindungen auf demselben Port verarbeiten können. Sobald die Verbindung hergestellt ist, wechselt die Kommunikation zu einem bidirektionalen Binärprotokoll, das nicht dem HTTP-Protokoll entspricht. Wikipedia

JSON C11
quelle