REST oder eine Nachrichtenwarteschlange in einem mehrschichtigen heterogenen System?

9

Ich entwerfe eine REST-API für ein dreistufiges System wie: Client application-> Front-end API cloud server-> user's home API server (Home).

Homeist ein Front-endHeimgerät und soll die Verbindung über Websocket oder eine lange Umfrage aufrechterhalten (dies ist der erste Ort, an dem wir gegen REST verstoßen. Es wird später noch schlimmer) . Front-endMeistens tunnelt Clienter HomeVerbindungsanfragen und bearbeitet einige der Anrufe selbst. HomeSendet manchmal Benachrichtigungen an Client.

Front-endund Homehaben im Grunde die gleiche API; ClientMöglicherweise wird eine Homedirekte Verbindung über LAN hergestellt. In diesem Fall Homemüssen einige ClientAktionen auf einem Front-endselbst registriert werden .

Vorteile für REST in diesem System sind:

  • REST ist für Menschen lesbar.
  • REST verfügt über eine genau definierte Zuordnung von Verben (wie CRUD), Substantiven und Antwortcodes zu Protokollobjekten.
  • Es funktioniert über HTTP und übergibt alle möglichen Proxys.

REST Contras sind:

  • Wir brauchen nicht nur einen Request-Response-Kommunikationsstil, sondern auch ein Publish-Subscribe.
  • HTTP-Fehlercodes reichen möglicherweise nicht aus, um dreistufige Kommunikationsfehler zu behandeln. Front-endkehrt möglicherweise 202 Acceptedzu einem asynchronen Aufruf zurück, um festzustellen, dass die erforderliche HomeVerbindung unterbrochen ist und hätte vorhanden sein müssen 503.
  • Homemuss Nachrichten an senden Client. Clientmuss abfragen Front-endoder eine Verbindung aufrechterhalten.

Wir erwägen, WAMP / Autobahn über Websocket zu veröffentlichen / abonnieren, als mir auffiel, dass es bereits wie eine Nachrichtenwarteschlange aussieht.

Lohnt es sich, eine Art Messaging-Warteschlange als Transportmittel zu bewerten?

Es sieht so aus, als wären Nachrichten-Warteschlangen-Contras:

  • Ich muss CRUD-Verben und Fehlercodes selbst auf Nachrichtenebene definieren.
  • Ich habe etwas über "höhere Wartungskosten" gelesen, aber was bedeutet das?

Wie ernst sind diese Überlegungen?

Victor Sergienko
quelle
1
Warum haben Sie einen Cloud-Server im Mix? Klingt so, als ob alles, was es tut, eine Umleitung ist, was mich denken lässt, dass es plausibel auf demselben Computer wie der Heimserver leben sollte ...
Jimmy Hoffa
3
Beachten Sie beim Analysieren von Nachrichtenwarteschlangen, dass die meisten von ihnen für private LANs optimiert sind: Geringe Latenz, kontrollierte Clients, geschütztes Netzwerk usw. Das Aussetzen der Warteschlange gegenüber dem Internet kann ein großes Sicherheitsproblem darstellen.
Javier
@Jimmy Hoffagültiger Punkt, danke. Das stimmt, aber nicht ganz. Es ist eine gemeinsame Datenbank, Speicher und so weiter. @JavierDanke, es ist ein guter Teil einer Antwort.
Victor Sergienko
Soll der Home-Server bei einem Benutzer zu Hause und im Front-End in der Cloud ausgeführt werden? Das Heim stellt eine Verbindung zum Front-End her und der Client sendet Nachrichten über das Front-End an das Heim. Wenn ich Ihr Design richtig verstehe, kann ich eine göttliche Antwort geben.
Michael Brown
@Mike Browngenau. Bitte.
Victor Sergienko

Antworten:

5

Wenn Sie über die Konnektivität verfügen, verwenden Sie eine Nachrichtenwarteschlange - obwohl Sie Ihre eigenen Protokolle definieren müssen (kaum eine schwierige Aufgabe!), Um Nachrichten mit einer bestimmten Struktur und einem bestimmten Format zu senden.

Das Problem bei der Wartung besteht darin, dass Client und Server normalerweise separat erstellt werden. Sie müssen also darauf achten, dass beide Enden dieselben Nachrichtendefinitionen verwenden. Wenn Sie jedoch nicht ausreichend organisiert sind, verwenden Sie einfach dasselbe XML, das Sie in Ihrem REST verwenden würden Bedienung.

Wenn Sie Verbindungsprobleme über das Internet haben, nur mit Port 80 und http und "unidirektionalen" Kommunikationen, ist ein System im REST-Stil wahrscheinlich das beste. Senden und abfragen oder einen Websocket für Rückrufdaten einrichten, aber im Allgemeinen ist Ihr System Client / Server. Wenn Sie die Möglichkeit haben, die Konnektivität zu erhalten, sind Messaging-Systeme großartig.

Ich würde mich für ein Messaging-System mit ZeroMQ entscheiden , das so konfigurierbar ist, dass es in allen möglichen Szenarien, einschließlich fehlertoleranter Szenarien, gedreht werden kann. Ich bin mir nicht sicher, ob es über http funktioniert .

gbjbaanb
quelle
Vielen Dank. Was ich nach dem @JavierKommentar gefunden habe: ØMQ scheint die Verschlüsselung selbst nicht zu unterstützen atm: zeromq.org/area:faq#toc8 obwohl RabbitMQ dies tut: rabbitmq.com/ssl.html
Victor Sergienko
Ich weiß nicht, ob ich die Konnektivität habe. Homeist ein Benutzer-Heimgerät und Clientein Smartphone über WLAN oder 3G. Ein großer Teil der Frage ist meine Unkenntnis über NAT-Traversal-Methoden.
Victor Sergienko
5

Es sieht so aus, als würde die Autobahn gut zu dem passen, was Sie versuchen. Es stehen auch andere Tools zur Verfügung. Überprüfen Sie den Windows Azure Service Bus (der Client-Frameworks für Java, .NET, PHP, Python, NodeJS und Ruby enthält).

Während die eingebauten Ruhemeldungen nützlich sind. Sie werden feststellen, dass Ihre Anwendung über grundlegende CRUD-Operationen hinauswächst. Zum Beispiel, wenn Ihre Anwendung ein Bankensystem wäre. Anstatt von

Update Konto 54321 Kontostand = Kontostand - 20.00 Update Konto 98765 Kontostand = Kontostand + 20.00 Uhr

Sie möchten wahrscheinlich eine einzelne Nachricht wie

Überweisen Sie 20.00 von Konto 54321 auf Konto 98765

Es ist am besten, wenn Sie dieses Hindernis bei REST jetzt und nicht später entdecken. Schauen Sie sich Greg Youngs Event Centric an, in dem erläutert wird, wie Sie ein umfassenderes Modell für Messaging in Ihrer Anwendung erstellen.

Michael Brown
quelle
Vielen Dank. In der Tat könnten wir CRUD entwachsen, obwohl unsere Domain nicht sehr bald ist, ist sie jetzt ziemlich einfach. Übrigens ist das Buch noch nicht veröffentlicht und versucht, einige Materialien in Gregs Blog zu finden ... Ich finde es gut, dass ich dafür keine Microsoft-Technologie verwenden muss.
Victor Sergienko
Warten Sie, sein Buch ist noch nicht erschienen ... er hat so lange darüber gesprochen ... klingt wie ein anderer technischer Autor, den ich kenne. : ">
Michael Brown
1
Für den Datensatz besteht der REST-Ansatz darin, eine von Ihnen erstellte Übertragungsressource zu haben. Oder sogar eine TransferRequest, die bestehen kann oder nicht. REST wird in einigen Fällen schwierig, aber dies ist keiner von ihnen.
Jacek Gorgoń