Ich habe SignalR
in 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 SignalR
fü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:
- Gibt es einen anderen Grund, SignalR anstelle aller Webdienste außer der Leistung nicht zu verwenden?
- 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 InterestingObject
und einen Dienst für CRUD
das Objekt InterestingObjectService
definiere, 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.
quelle
Antworten:
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
curl
Anruf 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.
quelle
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:
quelle