webentwicklung-frage-antwort-db.com.de

Mein Verständnis von HTTP Polling, Long Polling, HTTP Streaming und WebSockets

Ich habe viele Posts über SO und das Web in Bezug auf die Keywords in meinem Fragentitel gelesen und viel daraus gelernt. Einige der Fragen, die ich lese, beziehen sich auf bestimmte Implementierungsherausforderungen, während sich andere auf allgemeine Fragen konzentrieren Ich möchte nur sicherstellen, dass ich alle Konzepte und die Gründe, warum Technologie X erfunden wurde, über Technologie Y und so weiter verstanden habe.

Http Polling: Grundsätzlich AJAX mit XmlHttpRequest.

Http Long Polling: AJAX aber der Server behält die Antwort bei, es sei denn, der Server hat ein Update, sobald der Server ein Update hat, sendet er es und dann Der Client kann eine weitere Anforderung senden. Nachteil sind die zusätzlichen Header-Daten, die hin und her gesendet werden müssen, was zusätzlichen Overhead verursacht.

Http Streaming: Ähnlich wie bei langen Abfragen, aber der Server antwortet mit einem Header mit "Transfer Encoding: chunked" und muss daher nicht jedes Mal eine neue Anforderung initiiert werden, wenn der Server Daten sendet (und somit speichert) den zusätzlichen Header-Overhead). Der Nachteil hierbei ist, dass wir die Struktur der Daten "verstehen" und herausfinden müssen, um zwischen mehreren vom Server gesendeten Chunks zu unterscheiden.

Java Applet, Flash, Silverlight: Sie bieten die Möglichkeit, über TCP/IP eine Verbindung zu Socket-Servern herzustellen. Da es sich jedoch um Plugins handelt, möchten sich Entwickler nicht darauf verlassen.

WebSockets: Dies ist die neue API, die versucht, die Mängel der oben genannten Methoden auf folgende Weise zu beheben:

  • Der einzige Vorteil von WebSockets gegenüber Plugins wie Java Applets, Flash oder Silverlight ist, dass WebSockets nativ in Browser integriert sind und nicht auf Plugins basieren.
  • Der einzige Vorteil von WebSockets gegenüber HTTP-Streaming besteht darin, dass Sie sich nicht bemühen müssen, die empfangenen Daten zu "verstehen" und zu analysieren.
  • Der einzige Vorteil von WebSockets gegenüber Long Polling besteht darin, dass keine zusätzlichen Header mehr vorhanden sind und die Socket-Verbindung nicht mehr auf Anfrage geöffnet und geschlossen werden kann.

Gibt es noch andere signifikante Unterschiede, die mir fehlen? Es tut mir leid, wenn ich viele der Fragen, die sich bereits in SO=) befinden, erneut stelle oder zu einer einzigen Frage kombiniere, aber ich möchte aus all den Informationen, die es gibt, nur einen Sinn machen auf SO und das Web in Bezug auf diese Konzepte.

Vielen Dank!

107
Software Guy

Es gibt mehr Unterschiede als die, die Sie identifiziert haben.

Duplex/Richtung:

  • Unidirektional: HTTP-Umfrage, lange Umfrage, Streaming.
  • Bidirektional: WebSockets, Plugin-Netzwerk

In der Reihenfolge zunehmender Latenz (ungefähr):

  • WebSockets
  • Plugin-Vernetzung
  • HTTP-Streaming
  • HTTP-Long-Poll
  • HTTP-Abfrage

CORS (Cross-Origin-Unterstützung):

  • WebSockets: ja
  • Plugin-Netzwerk: Flash über Richtlinienanforderung (bei anderen nicht sicher)
  • HTTP * (einige neuere Unterstützung)

Native Binärdaten (typisierte Arrays, Blobs):

  • WebSockets: ja
  • Plugin-Netzwerk: nicht mit Flash (erfordert URL-Codierung über ExternalInterface)
  • HTTP *: Neuer Vorschlag zur Aktivierung der Unterstützung von Binärtypen

Bandbreite bei abnehmender Effizienz:

  • Plugin-Netzwerk: Flash-Sockets sind bis auf die erste Richtlinienanforderung unformatiert
  • WebSockets: Verbindungsaufbau-Handshake und einige Bytes pro Frame
  • HTTP-Streaming (Wiederverwendung der Serververbindung)
  • HTTP Long-Poll: Verbindung für jede Nachricht
  • HTTP-Abfrage: Verbindung für jede Nachricht + keine Datennachrichten

Unterstützung für Mobilgeräte:

  • WebSocket: iOS 4.2 und höher. Einige Android über Flash-Emulation oder mit Firefox für Android oder Google Chrome für Android die beide bieten native WebSocket-Unterstützung.
  • Plugin Networking: einige Android. Nicht für iOS
  • HTTP *: meistens ja

Komplexität der Verwendung von Javascript (von der einfachsten bis zur kompliziertesten). Allerdings sind Komplexitätsmaße etwas subjektiv.

  • WebSockets
  • HTTP-Umfrage
  • Plugin-Vernetzung
  • HTTP lange Umfrage, Streaming

Beachten Sie auch, dass es einen W3C-Vorschlag zur Standardisierung des HTTP-Streamings gibt, der Server-Sent Events heißt. Es befindet sich derzeit noch in einem relativ frühen Entwicklungsstadium und wurde entwickelt, um eine Standard-JavaScript-API bereitzustellen, die mit WebSockets vergleichbar einfach ist.

83
kanaka

Einige großartige Antworten von anderen, die viel Boden abdecken. Hier ist ein bisschen mehr.

Der einzige Vorteil von WebSockets gegenüber Plugins wie Java Applets, Flash oder Silverlight ist, dass WebSockets nativ in Browser integriert sind und nicht auf Plugins basieren.

Wenn Sie damit meinen, dass Sie Java Applets, Flash oder Silverlight verwenden können, um eine Socket-Verbindung herzustellen, dann ist das möglich, aber Sie sehen das nicht in der realen Welt zu oft wegen der Einschränkungen.

Beispielsweise können Vermittler diesen Datenverkehr beenden und beenden. Der WebSocket-Standard wurde so konzipiert, dass er mit der vorhandenen HTTP-Infrastruktur kompatibel ist, und ist daher weitaus weniger anfällig dafür, von Intermediären wie Firewalls und Proxys gestört zu werden.

Darüber hinaus kann WebSocket die Ports 80 und 443 verwenden, ohne dass dedizierte Ports erforderlich sind. Dies ist wiederum dem Protokolldesign zu verdanken, das mit der vorhandenen HTTP-Infrastruktur so kompatibel wie möglich ist.

Diese Socket-Alternativen (Java, Flash und Silverlight) sind in einer Cross-Origin-Architektur nur schwer sicher zu verwenden. Daher tolerieren Menschen, die häufig versuchen, sie herkunftsübergreifend zu verwenden, die Unsicherheiten, anstatt sich darum zu bemühen, sie sicher zu machen.

Sie können auch das Öffnen zusätzlicher "Nicht-Standard" -Ports (etwas, das Administratoren ablehnen) oder Richtliniendateien erfordern, die verwaltet werden müssen.

Kurz gesagt, die Verwendung von Java, Flash oder Silverlight für die Socket-Konnektivität ist so problematisch, dass Sie sie nicht allzu oft in seriösen Architekturen einsetzen. Flash und Java haben diese Fähigkeit wahrscheinlich seit mindestens 10 Jahren und sie ist dennoch nicht verbreitet.

Der WebSocket-Standard konnte unter Berücksichtigung dieser Einschränkungen mit einem neuen Ansatz beginnen und hoffentlich einige Lehren daraus ziehen.

Einige WebSocket-Implementierungen verwenden Flash (oder möglicherweise Silverlight und/oder Java) als Fallback, wenn die WebSocket-Konnektivität nicht hergestellt werden kann (z. B. wenn sie in einem alten Browser ausgeführt werden oder wenn ein Intermediär eingreift).

Während eine Art von Fallback-Strategie für diese Situationen klug ist, sogar notwendig, leiden die meisten derjenigen, die Flash et al. Verwenden, unter den oben beschriebenen Nachteilen. Das muss nicht so sein - es gibt Workarounds, um sichere ursprungsübergreifende Verbindungen mit Flash, Silverlight usw. herzustellen - aber die meisten Implementierungen tun dies nicht, weil es nicht einfach ist.

Wenn Sie sich beispielsweise für eine ursprungsübergreifende Verbindung auf WebSocket verlassen, funktioniert dies problemlos. Wenn Sie dann in einem alten Browser oder einer gestörten Firewall/einem gestörten Proxy-Server arbeiten und sich beispielsweise auf Flash verlassen, werden Sie Schwierigkeiten haben, dieselbe ursprungsübergreifende Verbindung herzustellen. Es sei denn, Sie kümmern sich nicht um Sicherheit, natürlich.

Das bedeutet, dass es schwierig ist, eine einzige einheitliche Architektur zu haben, die für native und nicht native Verbindungen funktioniert, es sei denn, Sie sind bereit, eine Menge Arbeit zu leisten oder ein Framework zu verwenden, das es gut gemacht hat. In einer idealen Architektur würden Sie nicht bemerken, ob die Verbindungen ursprünglich waren oder nicht. Ihre Sicherheitseinstellungen würden in beiden Fällen funktionieren. Ihre Clustering-Einstellungen würden weiterhin funktionieren. Ihre Kapazitätsplanung würde noch halten; und so weiter.

Der einzige Vorteil von WebSockets gegenüber HTTP-Streaming besteht darin, dass Sie sich nicht bemühen müssen, die empfangenen Daten zu "verstehen" und zu analysieren.

Es ist nicht so einfach, einen HTTP-Stream zu öffnen und sich zurückzulehnen, während Ihre Daten für Minuten, Stunden oder länger fließen. Verschiedene Clients verhalten sich unterschiedlich und das muss man managen. Beispielsweise puffern einige Clients die Daten und geben sie erst an die Anwendung weiter, wenn ein bestimmter Schwellenwert erreicht ist. Schlimmer noch, einige geben die Daten erst an die Anwendung weiter, wenn die Verbindung geschlossen ist.

Wenn Sie also mehrere Nachrichten an den Client senden, kann es sein, dass die Clientanwendung die Daten erst dann empfängt, wenn beispielsweise Daten im Wert von 50 Nachrichten empfangen wurden. Das ist nicht zu echt.

Während HTTP-Streaming eine praktikable Alternative sein kann, wenn WebSocket nicht verfügbar ist, handelt es sich nicht um ein Allheilmittel. Es bedarf eines guten Verständnisses, um unter realen Bedingungen auf robuste Weise im Ödland des Webs zu arbeiten.

Gibt es noch andere signifikante Unterschiede, die mir fehlen?

Es gibt noch eine andere Sache, die noch niemand erwähnt hat, also werde ich darauf eingehen.

Das WebSocket-Protokoll wurde als Transportschicht für übergeordnete Protokolle konzipiert. Sie können JSON-Nachrichten oder andere Nachrichten direkt über eine WebSocket-Verbindung senden. Sie können jedoch auch Standard- oder benutzerdefinierte Protokolle übertragen.

Sie können beispielsweise AMQP oder XMPP über WebSocket ausführen, wie dies bereits von anderen ausgeführt wurde. Ein Client kann also Nachrichten von einem AMQP-Broker empfangen, als ob er direkt mit dem Broker selbst verbunden wäre (und in einigen Fällen ist dies der Fall).

Wenn Sie einen vorhandenen Server mit einem benutzerdefinierten Protokoll haben, können Sie dieses über WebSocket transportieren und so diesen Back-End-Server auf das Web ausweiten. Häufig kann eine vorhandene Anwendung, die im Unternehmen gesperrt wurde, mithilfe von WebSocket die Reichweite erweitern, ohne dass die Back-End-Infrastruktur geändert werden muss.

(Natürlich möchten Sie dies alles auf sichere Weise tun können. Wenden Sie sich hierzu an den Anbieter oder den WebSocket-Anbieter.)

Einige Leute haben WebSocket als TCP für das Web bezeichnet. Genau wie TCP transportiert auch WebSocket Protokolle höherer Ebenen, aber auf eine Weise, die kompatibel ist mit Web-Infrastruktur.

Während das Senden von JSON-Nachrichten (oder was auch immer) direkt über WebSocket immer möglich ist, sollten auch vorhandene Protokolle berücksichtigt werden. Denn für viele Dinge, die Sie tun möchten, gibt es wahrscheinlich ein Protokoll, an das bereits gedacht wurde.

Es tut mir leid, wenn ich viele der Fragen, die sich bereits in SO=) befinden, erneut stelle oder zu einer einzigen Frage kombiniere, aber ich möchte aus all den Informationen, die es gibt, nur einen Sinn machen auf SO und das Web in Bezug auf diese Konzepte.

Dies war eine großartige Frage, und die Antworten waren alle sehr informativ!

13

Wenn ich noch etwas fragen darf: Ich bin in einem Artikel darauf gestoßen, dass HTTP-Streaming möglicherweise auch von Proxys zwischengespeichert wird, während Websockets dies nicht tun. was bedeutet das?

(StackOverflow begrenzt die Größe der Kommentarantworten, daher musste ich hier antworten und nicht inline.)

Das ist ein guter Punkt. Um dies zu verstehen, stellen Sie sich ein traditionelles HTTP-Szenario vor. Stellen Sie sich vor, ein Browser hat eine Webseite geöffnet und fordert beispielsweise http://example.com an. Der Server antwortet mit HTTP, das den HTML-Code für die Seite enthält. Dann erkennt der Browser, dass die Seite Ressourcen enthält, und fordert die CSS-Dateien, JavaScript-Dateien und Bilder an. Dies sind alle statischen Dateien, die für alle Clients, die sie anfordern, gleich sind.

Einige Proxys speichern statische Ressourcen im Cache, sodass nachfolgende Anforderungen von anderen Clients diese statischen Ressourcen vom Proxy abrufen können, anstatt den gesamten Weg zurück zum zentralen Webserver zurücklegen zu müssen, um sie abzurufen. Dies ist Caching und eine großartige Strategie, um Anforderungen und die Verarbeitung von Ihren zentralen Diensten auszulagern.

Client Nr. 1 fordert also http://example.com/images/logo.gif an. Diese Anforderung geht über den Proxy bis zum zentralen Webserver, auf dem logo.gif bereitgestellt wird. Während logo.gif den Proxy durchläuft, speichert der Proxy dieses Bild und verknüpft es mit der Adresse http://example.com/images/logo.gif .

Wenn Client Nr. 2 kommt und auch http://example.com/images/logo.gif anfordert, kann der Proxy das Image zurückgeben und es ist keine Kommunikation zum Webserver in der Mitte erforderlich. Dies gibt dem Endbenutzer eine schnellere Antwort, was immer großartig ist, aber auch bedeutet, dass das Zentrum weniger belastet wird. Dies kann zu reduzierten Hardwarekosten, reduzierten Netzwerkkosten usw. führen. Es ist also eine gute Sache.

Das Problem tritt auf, wenn das logo.gif auf dem Webserver aktualisiert wird. Der Proxy dient weiterhin dem alten Image, ohne zu wissen, dass es ein neues Image gibt. Dies führt zu einer vollständigen Umgehung des Ablaufs, sodass der Proxy das Image nur für kurze Zeit zwischenspeichert, bevor es "abläuft", und die nächste Anforderung über den Proxy an den Webserver geleitet wird, der dann den Cache des Proxys aktualisiert. Es gibt auch fortschrittlichere Lösungen, bei denen ein zentraler Server auf bekannte Caches usw. pushen kann und die Dinge ziemlich komplex werden können.

Wie passt das zu Ihrer Frage?

Sie haben nach dem HTTP-Streaming gefragt, bei dem der Server HTTP an einen Client überträgt. Das Streamen von HTTP funktioniert jedoch genauso wie normales HTTP, nur dass Sie nicht aufhören, Daten zu senden. Wenn ein Webserver ein Image bereitstellt, sendet er HTTP an den Client, der schließlich endet: Sie haben das gesamte Image gesendet. Und wenn Sie Daten senden möchten, ist es genau das Gleiche, aber der Server sendet nur für eine sehr lange Zeit (wie zum Beispiel ein enorm gigantisches Bild) oder endet sogar nie.

Aus Sicht des Proxys kann nicht zwischen HTTP für eine statische Ressource wie ein Bild oder Daten aus dem HTTP-Streaming unterschieden werden. In beiden Fällen stellte der Client eine Anfrage an den Server. Der Proxy erinnerte sich an diese Anfrage und auch an die Antwort. Bei der nächsten Anforderung wird vom Proxy dieselbe Antwort bereitgestellt.

Wenn Ihr Kunde beispielsweise eine Anfrage nach Aktienkursen gestellt und eine Antwort erhalten hat, kann der nächste Kunde dieselbe Anfrage stellen und die zwischengespeicherten Daten abrufen. Wahrscheinlich nicht was du willst! Wenn Sie Aktienkurse anfordern, möchten Sie die neuesten Daten, oder?

Es ist also ein Problem.

Es gibt Tricks und Workarounds, um solche Probleme zu lösen. Offensichtlich können Sie HTTP-Streaming zum Laufen bringen, da es heute verwendet wird. Es ist alles für den Endbenutzer transparent, aber die Leute, die diese Architekturen entwickeln und warten, müssen durch die Hürden springen und einen Preis zahlen. Dies führt zu überkomplizierten Architekturen, was mehr Wartung, mehr Hardware, mehr Komplexität und mehr Kosten bedeutet. Dies bedeutet auch, dass sich Entwickler häufig um etwas kümmern müssen, das sie nicht müssen, wenn sie sich nur auf die Anwendung, die Benutzeroberfläche und die Geschäftslogik konzentrieren sollen - sie sollten sich nicht um die zugrunde liegende Kommunikation sorgen müssen.

10

HTTP begrenzt die Anzahl der Verbindungen, die ein Client mit einem Server haben kann, auf 2 (obwohl dies durch die Verwendung von Unterdomänen verringert werden kann), und es ist bekannt, dass IE dies eifrig erzwingt. Firefox und Chrome erlauben mehr (obwohl ich mich nicht genau erinnern kann, wie viele). Dies scheint kein großes Problem zu sein. Wenn Sie jedoch ständig eine Verbindung für Echtzeitaktualisierungen verwenden, müssen alle anderen Anforderungen über die andere HTTP-Verbindung einen Engpass aufweisen. Und es ist wichtig, dass mehr offene Verbindungen von Clients den Server stärker belasten.

WebSockets sind ein TCP-basiertes Protokoll und unterliegen daher nicht diesem HTTP-Verbindungslimit (die Browserunterstützung ist jedoch nicht einheitlich).

4
TheJuice