Ist die Leistung der einzige Grund, SignalR (Websockets) nicht vollständig anstelle einer herkömmlichen REST-API zu verwenden?


42

Ich habe SignalRin mehreren meiner Projekte Echtzeit-Messaging-Funktionen verwendet. Es scheint zuverlässig zu funktionieren und ist sehr einfach zu erlernen.

Zumindest für mich ist die Versuchung, die Entwicklung eines Web-API-Dienstes aufzugeben und SignalRfür alles zu verwenden.

Ich bin der Meinung, dass dies durch durchdachtes Design erreicht werden könnte, und wenn dies der Fall wäre, würde dies bedeuten, dass weit weniger Client-Code erforderlich wäre. Wichtiger noch, es würde bedeuten, dass es eine einzige Schnittstelle zu Diensten geben würde und keine geteilte Schnittstelle, und im schlimmsten Fall könnte man dies verkabeln, ohne darüber nachzudenken, wann Dinge gerendert werden usw.

Also, ich würde gerne wissen:

  1. Gibt es einen anderen Grund, SignalR anstelle aller Webdienste außer der Leistung nicht zu verwenden?
  2. Ist die Leistung von SignalR so hoch, dass dies keinen Sinn ergibt?

Es war lange mein Traum, serverseitige Objekt- und Dienstdefinitionen in clientseitigen Dienstzugriffscode zu übersetzen, ohne etwas Dummes node.js. Wenn ich beispielsweise ein interessantes Objekt InterestingObjectund einen Dienst für CRUDdas Objekt InterestingObjectServicedefiniere, kann ich eine Standard-URL-Route für den Dienst definieren, z. B. "/ {Dienstname} / {Methodenname}". Für den Zugriff muss ich jedoch noch Client-Code schreiben der Service. Da das Objekt vom Client zum Server und zurück übertragen wird, gibt es keinen praktischen Grund dafürUm das Objekt explizit im clientseitigen Code zu definieren, sollte auch keine explizite Definition der Routen zur Ausführung von CRUD-Operationen erforderlich sein. Ich bin der Meinung, dass es eine Möglichkeit geben sollte, all dies zu standardisieren, sodass es möglich ist, einen Client unter der Annahme zu schreiben, dass der Dienstzugriff vom Client auf den Server und zurück so transparent funktioniert, als würde ich WinForms oder Java schreiben Applet oder native App oder was hast du.

Wenn SignalR gut genug ist, um anstelle eines herkömmlichen Webdienstes verwendet zu werden, ist dies möglicherweise ein praktikabler Weg, um dies zu erreichen. SignalR enthält bereits Funktionen, mit denen der Hub wie der von mir beschriebene Service funktioniert, sodass ich einen Common-Base-Service (CRUD) definieren kann, der alle diese Funktionen ohne weitere Überlegungen bietet. Dann könnte ich den Zugriff auf den Dienst fast für selbstverständlich halten und mir den Ärger ersparen, Code neu zu schreiben, um auf etwas zuzugreifen, auf das per Konvention zugegriffen werden kann - und vor allem die Zeit, die ich für das Schreiben von Code aufwenden müsste, um zu definieren, wie dieser aktualisiert wird das DOM.

Nachdem ich meinen Artikel gelesen habe, bin ich der Meinung, dass es etwas unsinnig sein könnte. Bitte fragen Sie mich, wenn Sie Fragen dazu haben, worauf ich hinaus will. Grundsätzlich möchte ich, dass der Service-Zugang so transparent wie möglich ist.


5
Wenn Sie eine magische Netzwerkkarte haben, die eine unendliche Anzahl von Sockets offen hält, und ein magisches Netzwerk, das eine unendliche Menge an Bandbreite unterstützt, und einen magischen Server, der eine unendliche Menge an Speicher und CPU-Zyklen hat, dann ist nur Websockets eine gute Wahl!

Csla macht was Sie wollen, Geschäftsobjekte können sich selbst zwischen Client und Server bewegen.
Andy

Antworten:


50

Diese beiden Technologien haben einen sehr unterschiedlichen Zweck.

  • REST ist für normale Aufrufe einer API vorgesehen, wobei der Client ein aktiver Akteur der Vermittlung ist. Wenn die Client - GPS - Koordinaten von einer Adresse zu finden , muss die Client empfängt , initiiert der Aufruf an die API zurück und wartet , bis er die Koordinaten oder ein Fehler auftritt, oder ein Timeout abgelaufen ist .

  • Web-Sockets sind für alles gedacht, was das Gegenteil bewirken muss. Wenn ich beispielsweise eine Intranet-Website verwende, auf der die Protokolle und die Leistung verschiedener Server in Echtzeit angezeigt werden , ist der Client möglicherweise passiv und wartet, bis der Server ihm eine neu veröffentlichte Protokollnachricht oder Leistungsmetriken sendet.

Der Unterschied liegt auf der Hand: Im ersten Fall entscheidet der Kunde, wann er eine bestimmte Information benötigt. Im zweiten Fall wartet der Client einfach darauf, kontaktiert zu werden, und weiß möglicherweise nicht, wann dies der Fall ist.

In gewisser Weise sind beide austauschbar: Sie können Web-Sockets implementieren, wenn Sie sie nicht benötigen (dh der Client ruft den Server über Web-Sockets auf, anstatt einen REST-Aufruf zu tätigen), und Sie können Polling oder Long Polling als Ersatz für verwenden Web-Sockets (da dies jahrelang erfolgreich eingesetzt wurde, bis Web-Sockets so populär wurden).

Ihre Austauschbarkeit ist jedoch mit Kosten verbunden:

  • Wenn Sie Polling oder Long Polling anstelle von Web-Sockets verwenden, verschwenden Sie häufig Bandbreite.

  • Wenn Sie Web-Sockets verwenden, um das zu tun, was über die Web-API getan werden kann, behalten Sie alle Verbindungen von allen aktiven Clients geöffnet, was möglicherweise nicht das ist, was Sie wirklich wollen. Für eine kleine Website, auf der Sie maximal 5 Kunden gleichzeitig erwarten, ist dies kein Problem. Für einen Dienst wie Amazon AWS wäre dies technisch nicht einfach zu lösen.

Verwenden Sie keine Web-Sockets, wenn Sie sie nicht benötigen. Um die GPS-Koordinaten einer Adresse zu erhalten, erhalte ich keine Vorteile, wenn ich eine Web-Sockets-Verbindung öffne, einen Anruf tätige, auf eine Antwort warte und die Verbindung beende: REST erfüllt meine Anforderungen für solche Szenarien.

  • Wenn Sie bei einem REST-Aufruf eines Dienstes wiederholt und häufig nach Informationen suchen, kann dies ein gutes Zeichen dafür sein, dass Sie auf Web-Sockets umsteigen sollten. In ähnlicher Weise reduziert der Stapelüberlauf die Bandbreitennutzung durch die Verwendung von Web-Sockets, da die Benutzer weniger Zeit damit verbringen müssen, F5 auf der Homepage zu drücken, um festzustellen, ob neue Nachrichten vorliegen.

  • Wenn Sie feststellen, dass Sie Web-Sockets-Verbindungen öffnen, einen einzelnen Anruf tätigen und diese dann schließen, oder wenn Ihre Verbindungen weiterhin geöffnet sind, der Server jedoch nur auf Anforderung des Clients etwas an den Client sendet, wechseln Sie zu REST.

Außerdem haben Web-Sockets immer noch eine eingeschränkte Unterstützung und sind nicht immer einfach zu implementieren. Obwohl die Implementierung von SignalR einfach ist, bedeutet dies nicht, dass Sie keine Schwierigkeiten haben, es in anderen Sprachen / Kontexten / Umgebungen zu implementieren. Mit REST ist das ganz einfach: Es kann sich um einen curlAnruf oder eine ähnliche Funktion handeln, die in jeder gängigen Sprache verfügbar ist. Bei Web-Sockets können Sie nicht sicher sein, wie lange es dauern würde, bis ein Client [den Namen einer Sprache einfügt, die Sie hier noch nicht kennen] verwendet.

Ich habe in mehreren Projekten in .NET, Python und node.js Web-Sockets verwendet.

  • In .NET war es nicht allzu schwierig, aber ich habe immer noch ein paar Tage damit verbracht, einige kryptische Probleme herauszufinden, z. B., dass die Verbindung abgebrochen wurde, sobald sie geöffnet wurde. (Dies war vor SignalR; ich habe SignalR nie ausprobiert). Ich habe WCF auch im Web-Sockets-Modus verwendet, was auch nicht ohne Probleme war (aber ich glaube, dass WCF immer mit Problemen verbunden ist).

  • In node.js war das machbar, aber ich musste die Bibliotheken zweimal wechseln, bis ich eine gefunden habe, die funktioniert. Ich glaube, ich habe mindestens eine Woche damit verbracht, einen Web-Sockets Hello World zu machen.

  • In Python habe ich es einmal versucht, zwei oder drei Tage verbracht und aufgegeben. Es hat nie funktioniert.

Vergleichen Sie dies mit REST: Die einzigen Probleme, die bei einer neuen Sprache / einem neuen Framework auftreten können, sind das POST von Dateien oder das Empfangen einer sehr großen Binärantwort. Ich erinnere mich, dass ich einige Stunden damit verbracht habe, nach Lösungen für einige Sprachen zu suchen. Dennoch sind ein paar Stunden für einen Sonderfall nichts im Vergleich zu Tagen oder Wochen für eine einfache Hallo-Welt.


2
Hat deine Antwort, MainMa, positiv bewertet, da ich sie interessant / hilfreich fand. Es gibt jedoch einen Punkt, den ich nicht verstehe. Sie erwähnen, dass eine kleine Anzahl von Clients in der Lage ist, Web-Sockets zu verarbeiten (z. B. höchstens 5 gleichzeitig). Dann erwähnen Sie, dass StackOverflow auf seiner Homepage Web-Sockets verwendet. Wie gehen sie mit so vielen Nutzern um? Ich frage, weil ich mehr als 20 SignalR-Verbindungen versuche und die Nachrichtenverzögerungen langsam zunehmen, bevor das Ganze abstürzt (alles reagiert nicht mehr).
Gnychis

1
@gnychis: Es gibt viele Lösungen dafür, aber viele beziehen sich eher auf die Infrastruktur selbst (dafür ist serverfault.com da ). Generell sollten Sie mehr Hardware einsetzen und Benutzer auf Domänen aufteilen, sodass einige Verbindungen von sockets1.example.com, andere von sockets2.example.com usw. verarbeitet werden. Sehr effektiv, aber auch in Bezug auf Hardware und Bandbreite recht teuer.
Arseni Mourzenko

3
Diese Antwort ist ausgezeichnet, aber ich möchte die ursprüngliche Frage einschränken. Wenn für eine App eine kontinuierliche Websocket-Verbindung erforderlich ist, können Sie Websockets statt einer REST-API verwenden. Da ein Websocket offen ist, sollte er möglicherweise voll genutzt werden.
HappyNomad

Ich habe gerade eine Antwort auf meine eigene Frage gefunden.
HappyNomad

1

Nur meine 2 Cent ...

Ich denke, es geht nicht wirklich um Leistung oder was auch immer. Es geht um Standards. REST ist ein Standard und IMHO hat folgende Vorteile:

  • HTTP-Anforderungen sind einfach zu verwenden. Jeder kann schnell eine REST-API verwenden. Sie können sogar den Browser öffnen und eine URL eingeben, um die Daten anzuzeigen. Wie interaktiv können Sie sein?
  • (Fast) jede Programmiersprache kann es verwenden. Es ist eine Art universelle Schnittstelle. Die Schnittstelle zu SignalR aus einer exotischen Sprache ist weniger offensichtlich.
  • Es hat nette Werkzeugunterstützung, wie http://petstore.swagger.wordnik.com/
  • Es ist eine schöne "Schnittstelle" zum Debuggen. Sie können ein- und ausgehende Nachrichten einfach direkt im Browser überwachen, Daten anzeigen usw. Bei Websockets und benutzerdefinierten Bibliotheken ist es nicht so offensichtlich, dass Sie alles explizit protokollieren müssen.

1
Während Sie einige gute Argumente dafür anführen, dass REST-APIs etwas unkomplizierter sind und wahrscheinlich über bessere Tools verfügen, sagt diese Antwort ein paar Dinge aus, die einfach nicht stimmen. REST ist kein Standard , WebSockets jedoch .
StriplingWarrior

1
Ich denke, es war eine schlechte Formulierung von meiner Seite. Was ich mit "Standard" gemeint habe, ist, dass es alltäglich und weit verbreitet ist, die Standardmethode, Dinge zu tun ... und nicht "ein RFC-Standard zu sein".
dagnelies

Gute Klarstellung. Und übrigens können Sie in Chrome zumindest den WebSockets-Datenverkehr in den Entwicklertools anzeigen. Ich stelle mir vor, dass die anderen Browser dies wahrscheinlich auch tun.
StriplingWarrior
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.