Mit RESTful HTTP haben Sie ein Stateless Request/Response-System wo der Client Anfrage sendet und der Server die Antwort zurückgibt.
Mit webSockets haben Sie eine Stateful (oder potenziell stateful) Nachrichtenübergabe-System, wo Nachrichten gesendet werden können, und Senden einer gegebenen Nachricht ist niedriger Aufwand als mit einem RESTful HTTP-Anfrage/Antwort.
Die beiden sind ziemlich unterschiedliche Strukturen mit unterschiedlichen Stärken.
Die Hauptvorteile eines angeschlossenen WebSocket sind:
Zwei-Wege-Kommunikation. So kann der Server den Kunden jederzeit über alles informieren. Anstatt einen Server in regelmäßigen Abständen abzufragen, um festzustellen, ob es etwas Neues gibt, kann ein Client einen webSocket einrichten und nur auf Nachrichten warten, die vom Server kommen. Aus Sicht des Servers sendet der Server, wenn ein Ereignis auftritt, das für einen Client von Interesse ist, einfach eine Nachricht an den Client. Der Server kann dies nicht mit einfachem HTTP tun.
Geringerer Overhead pro Nachricht. Wenn Sie erwarten, dass viel Verkehr zwischen Client und Server fließt, ist der Aufwand pro Nachricht mit einem webSocket geringer. Dies liegt daran, dass die TCP-Verbindung bereits hergestellt ist und Sie lediglich eine Nachricht an einen bereits geöffneten Socket senden müssen. Bei einer HTTP-REST-Anforderung müssen Sie zunächst eine TCP-Verbindung herstellen, bei der es sich um mehrere Rück- und Herleitungen zwischen Client und Server handelt. Dann senden Sie eine HTTP-Anfrage, erhalten die Antwort und schließen die TCP-Verbindung. Die HTTP-Anforderung enthält notwendigerweise einen gewissen Overhead, z. B. alle Cookies, die mit diesem Server ausgerichtet sind, auch wenn diese für die jeweilige Anforderung nicht relevant sind.HTTP/2 (neueste HTTP-Spezifikation) ermöglicht in dieser Hinsicht eine zusätzliche Effizienz, wenn es sowohl vom Client als auch vom Server verwendet wird, da eine einzelne TCP-Verbindung für mehr als nur eine einzelne Anfrage/Antwort verwendet werden kann. Wenn Sie alle Anfragen/Antworten auf TCP-Ebene kartiert haben, nur um eine HTTPS-REST-Anfrage/-Antwort zu erstellen, würden Sie überrascht sein, wie viel los ist, verglichen mit dem Senden einer Nachricht über einen bereits eingerichteten WebSocket.
Höhere Skalierung in einigen Fällen. Mit geringerem Overhead pro Nachricht und keiner Clientabfrage, um herauszufinden, ob etwas neu ist, kann dies zu zusätzlicher Skalierbarkeit führen (höhere Anzahl von Clients, die ein bestimmter Server bedienen kann). Die Skalierbarkeit von webSocket hat ebenfalls Nachteile (siehe unten).
Stateful Verbindungen. Ohne auf Cookies und Sitzungs-IDs zurückgreifen zu müssen, können Sie den Status für eine bestimmte Verbindung direkt in Ihrem Programm speichern. Während mit statuslosen Verbindungen viele Entwicklungen zur Lösung der meisten Probleme gemacht wurden, ist es manchmal einfacher mit zustandsbehafteten Verbindungen.
Die primären Vorteile einer RESTful HTTP-Anforderung/Antwort, sind:
Universal-Unterstützung. Es ist schwierig, universeller als HTTP zu unterstützen. Obwohl webSockets jetzt relativ gut unterstützt werden, gibt es immer noch Fälle, in denen der webSocket-Support nicht regelmäßig verfügbar ist.
Kompatibel mit mehr Serverumgebungen. Es gibt Serverumgebungen, die keine lang andauernden Serverprozesse zulassen (einige Shared Hosting-Situationen). Diese Umgebungen können HTTP-Anforderungen unterstützen, lange WebSocket-Verbindungen jedoch nicht.
Höhere Skalierung in einigen Fällen. Die webSocket-Anforderung für einen kontinuierlich verbundenen TCP-Socket fügt der Serverinfrastruktur einige neue Skalierungsanforderungen hinzu, die von HTTP-Anforderungen nicht verlangt werden. Also, dies endet als Tradeoff-Raum. Wenn die Vorteile von webSockets nicht wirklich benötigt werden oder in signifikanter Weise genutzt werden, können HTTP-Anfragen tatsächlich besser skalieren. Es hängt definitiv vom spezifischen Nutzungsprofil ab.
Für eine einmalige Anfrage/Antwort ist eine einzelne HTTP-Anfrage effizienter als das Einrichten eines webSocket, den es verwendet und dann schließt. Dies liegt daran, dass das Öffnen eines webSockets mit einer HTTP-Anfrage/Antwort beginnt. Nachdem beide Seiten die Aktualisierung auf eine webSocket-Verbindung vereinbart haben, kann die eigentliche webSocket-Nachricht gesendet werden.
Staatenlos. Wenn Ihre Aufgabe nicht durch eine zustandslose Infrastruktur komplizierter wird, kann eine staatenlose Welt die Skalierung erheblich vereinfachen (fügen Sie einfach mehr Serverprozesse hinter einem Load Balancer hinzu).
Automatisch zwischenspeichern. Mit den richtigen Servereinstellungen können HTTP-Antworten vom Browser oder von Proxies zwischengespeichert werden. Es gibt keinen solchen integrierten Mechanismus für Anfragen, die über webSockets gesendet werden.
Also fragte den Weg zur Adresse, die Sie sich die Frage:
Was sind die Gefahren der Verwendung von WebSockets anstelle von RESTful HTTP sind?
in großem Maßstab (Hunderttausende von Kunden), können Sie eine spezielle Server-Arbeit zu unterstützen, um eine große Anzahl von gleichzeitig verbundenen WebSockets zu tun haben.
Alle möglichen Clients oder Toolsets unterstützen WebSockets oder Anforderungen, die über sie vorgenommen werden, nicht auf derselben Ebene, auf der sie HTTP-Anforderungen unterstützen.
Einige der weniger kostspieligen Serverumgebungen unterstützen nicht die langwierigen Serverprozesse, die zur Unterstützung von webSockets erforderlich sind.
Wenn es um Ihre Anwendung wichtig ist, Benachrichtigungen zu erhalten, an den Client Fortschritt zurück, könnten Sie entweder eine lange laufenden HTTP-Verbindung mit kontinuierlichen Fortschritte herabgesandt wird, oder Sie können einen WebSocket verwenden. Der webSocket ist wahrscheinlich einfacher. Wenn Sie wirklich nur den webSocket für die relativ kurze Dauer dieser bestimmten Aktivität benötigen, dann finden Sie möglicherweise die beste Gesamtmenge von Kompromissen, indem Sie einen webSocket nur für die Dauer der Zeit verwenden, wenn Sie die Fähigkeit haben, Daten zum Klienten zu schieben und Dann werden HTTP-Anfragen für die normalen Anfrage/Antwort-Aktivitäten verwendet.
Danke für die ausführliche Antwort. Ich warte immer noch auf diesen magischen Rahmen, der Websockets de facto zur Erstellung von Webanwendungen macht. Ich mag wirklich, was Spring mit Websockets macht. Vielleicht wird es sich zu etwas Großem auf der Straße entwickeln. – smuggledPancakes
Warum erwähnt niemand, dass REST-Antworten cachefähig sind und es keine einfache/automatische Möglichkeit gibt, das Websocket-Ergebnis zu cachen? – metamaker
@metamaker - Das ist ein vernünftiger Punkt und ich werde es hinzufügen. WebSocket-Verbindungen werden jedoch normalerweise nicht für Anfragen/Antworten von Aktivitäten verwendet, bei denen das Caching relevant ist und tatsächlich ist http normalerweise die empfohlene Wahl für reine Anfragen/Antworten. – jfriend00