webentwicklung-frage-antwort-db.com.de

Was sind die Tücken bei der Verwendung von Websockets anstelle von RESTful HTTP?

Ich arbeite derzeit an einem Projekt, bei dem der Client einen großen Auftrag anfordert und ihn an den Server sendet. Anschließend teilt der Server den Auftrag auf und antwortet mit einer Reihe von URLs, über die der Client einen GET-Aufruf tätigen und die Daten zurückströmen kann. Ich bin das Greenhorn des Projekts und verwende derzeit Spring-Websockets, um die Effizienz zu verbessern. Anstatt dass die Clients den Server ständig anpingen, um zu prüfen, ob die Ergebnisse für das Streaming bereit sind, kontaktiert der Websocket den Client jetzt direkt, Hurra!

Wäre es eine schlechte Idee, Websockets den gesamten Prozess von Anfang bis Ende verwalten zu lassen? Ich verwende STOMP mit Spring-Websockets. Gibt es noch größere Probleme mit der REST-Notlösung?

53

Mit RESTful HTTP haben Sie ein zustandsloses Anforderungs-/Antwortsystem, bei dem der Client eine Anforderung sendet und der Server die Antwort zurückgibt.

Mit webSockets verfügen Sie über ein zustandsbehaftetes (oder möglicherweise zustandsbehaftetes) Nachrichtenübermittlungssystem, bei dem Nachrichten in beide Richtungen gesendet werden können und das Senden einer bestimmten Nachricht ist mit geringerem Aufwand verbunden als bei einer RESTful-HTTP-Anforderung/-Antwort.

Die beiden sind ziemlich unterschiedliche Strukturen mit unterschiedlichen Stärken.

Die Hauptvorteile eines verbundenen webSockets sind:

  1. bidirektionale Kommunikation Der Server kann den Client also jederzeit über alles informieren. Anstatt einen Server in regelmäßigen Abständen auf neue Informationen abzufragen, kann ein Client einen webSocket einrichten und einfach auf Nachrichten vom Server warten. Aus Sicht des Servers sendet der Server beim Eintreten eines Ereignisses, das für einen Client von Interesse ist, einfach eine Nachricht an den Client. Der Server kann dies nicht mit normalem HTTP ausführen.

  2. Geringerer Overhead pro Nachricht. Wenn Sie einen hohen Datenverkehr zwischen Client und Server erwarten, ist der Overhead pro Nachricht mit einem webSocket geringer. Dies liegt daran, dass die TCP - Verbindung bereits hergestellt wurde und Sie lediglich eine Nachricht an einen bereits geöffneten Socket senden müssen. Bei einer HTTP REST - Anforderung müssen Sie dies tun Stellen Sie zunächst eine TCP - Verbindung her, die zwischen Client und Server hin und her wechselt. Anschließend senden Sie eine HTTP-Anfrage, empfangen die Antwort und schließen die TCP= - Verbindung. Die HTTP-Anfrage wird notwendigerweise einen gewissen Overhead beinhalten, wie beispielsweise alle Cookies, die auf diesen Server ausgerichtet sind, auch wenn diese für die jeweilige Anfrage nicht relevant sind. HTTP/2 (neueste HTTP-Spezifikation) ermöglicht diesbezüglich eine zusätzliche Effizienz, wenn sie verwendet wird sowohl vom Client als auch vom Server, da eine einzige TCP Verbindung für mehr als nur eine einzelne Anforderung/Antwort verwendet werden kann. Wenn Sie alle Anforderungen/Antworten aufgezeichnet haben, die am TCP Ebene nur um eine https REST Antwort zu machen, wären Sie überrascht, wie viel los ist im Vergleich zum Senden einer Nachricht über einen bereits eingerichteten WebSock et.

  3. Höhere Skalierung unter bestimmten Umständen. Mit geringerem Overhead pro Nachricht und ohne Client-Abfrage, ob etwas neu ist, kann dies zu einer zusätzlichen Skalierbarkeit führen (höhere Anzahl von Clients, die ein bestimmter Server bedienen kann). Die webSocket-Skalierbarkeit hat auch Nachteile (siehe unten).

  4. Stateful connections. Ohne auf Cookies und Sitzungs-IDs zurückzugreifen, können Sie den Status einer bestimmten Verbindung direkt in Ihrem Programm speichern. Während für die meisten Probleme viel Entwicklungsarbeit mit statuslosen Verbindungen geleistet wurde, ist dies bei statusbehafteten Verbindungen manchmal einfacher.

Die Hauptvorteile einer RESTful HTTP-Anfrage/Antwort sind:

  1. niverselle Unterstützung. Es ist schwer, eine universellere Unterstützung als HTTP zu erhalten. Obwohl webSockets jetzt relativ gut unterstützt wird, gibt es immer noch einige Umstände, in denen webSocket-Unterstützung nicht regelmäßig verfügbar ist.

  2. Kompatibel mit mehr Serverumgebungen. Es gibt Serverumgebungen, die keine lang laufenden Serverprozesse zulassen (einige Shared Hosting-Situationen). Diese Umgebungen können HTTP-Anforderungen unterstützen, jedoch keine lang laufenden webSocket-Verbindungen.

  3. Höhere Skalierung unter bestimmten Umständen. Die webSocket-Anforderung für einen kontinuierlich verbundenen TCP Socket fügt der Serverinfrastruktur einige neue Skalierungsanforderungen hinzu, die HTTP-Anforderungen nicht erfordern. Dies stellt einen Kompromiss dar. Wenn die Vorteile von webSockets nicht wirklich benötigt werden oder in erheblichem Maße genutzt werden, können HTTP-Anforderungen tatsächlich besser skaliert werden. Dies hängt definitiv vom spezifischen Nutzungsprofil ab.

  4. Bei einer einmaligen Anfrage/Antwort ist eine einzelne HTTP-Anfrage effizienter, als ein webSocket einzurichten, es zu verwenden und dann zu schließen. Dies liegt daran, dass das Öffnen eines WebSockets mit einer HTTP-Anforderung/-Antwort beginnt und nachdem beide Seiten ein Upgrade auf eine WebSocket-Verbindung vereinbart haben, die eigentliche WebSocket-Nachricht gesendet werden kann.

  5. Stateless. Wenn Ihr Job durch eine zustandslose Infrastruktur nicht komplizierter wird, kann eine zustandslose Welt die Skalierung erheblich vereinfachen (fügen Sie einfach mehr Serverprozesse hinter einem Load Balancer hinzu).

  6. Automatisch zwischenspeicherbar. Mit den richtigen Servereinstellungen können http-Antworten vom Browser oder von Proxys zwischengespeichert werden. Es gibt keinen solchen eingebauten Mechanismus für Anfragen, die über webSockets gesendet werden.


Um die Art und Weise zu beantworten, wie Sie die Frage gestellt haben:

Was sind die Tücken bei der Verwendung von Websockets anstelle von RESTful HTTP?

  1. In großem Umfang (Hunderttausende von Clients) müssen Sie möglicherweise einige spezielle Serverarbeiten ausführen, um eine große Anzahl gleichzeitig verbundener webSockets zu unterstützen.

  2. Alle möglichen Clients oder Toolsets unterstützen keine webSockets oder Anforderungen, die über sie gesendet wurden, auf demselben Niveau, auf dem sie HTTP-Anforderungen unterstützen.

  3. Einige der kostengünstigeren Serverumgebungen unterstützen nicht die lang laufenden Serverprozesse, die für die Unterstützung von webSockets erforderlich sind.

Wenn es für Ihre Anwendung wichtig ist, Fortschrittsbenachrichtigungen an den Client zurückzusenden, können Sie entweder eine lang laufende http-Verbindung mit anhaltendem Fortschrittsversand verwenden oder einen webSocket verwenden. Das webSocket ist wahrscheinlich einfacher. Wenn Sie den webSocket wirklich nur für die relativ kurze Dauer dieser bestimmten Aktivität benötigen, können Sie die besten Kompromisse erzielen, wenn Sie einen webSocket nur für die Dauer verwenden, für die Sie die Möglichkeit benötigen, Daten an den Client und zu übertragen Verwenden Sie dann http-Anforderungen für die normalen Anforderungs-/Antwortaktivitäten.

94
jfriend00

Es hängt wirklich von Ihren Anforderungen ab. REST Services können für Entwickler viel transparenter und einfacher zu finden sein als Websockets.

Mit Websockets entfernen Sie die meisten Vorteile, die RESTful-Webservices bieten, z. B. die Möglichkeit, eine Ressource über einen URI zu referenzieren. Was Sie wirklich tun sollten, ist herauszufinden, welche Vorteile REST und Hypermedia haben, und basierend darauf zu entscheiden, ob diese Vorteile für Sie wichtig sind.

Es ist natürlich durchaus möglich, einen REST-fähigen Webservice zu erstellen und ihn mit einer Websocket-basierten API für Echtzeitantworten zu erweitern.

Wenn Sie jedoch einen Dienst erstellen, den nur Sie in einer kontrollierten Umgebung nutzen werden, besteht der einzige Nachteil möglicherweise darin, dass nicht jeder Client Websockets unterstützt, während praktisch jede Art von Umgebung einen einfachen http-Aufruf ausführen kann.

3
Evert