Ich entwerfe eine REST-API für ein dreistufiges System wie: Client application
-> Front-end API cloud server
-> user's home API server (Home)
.
Home
ist ein Front-end
Heimgerä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-end
Meistens tunnelt Client
er Home
Verbindungsanfragen und bearbeitet einige der Anrufe selbst. Home
Sendet manchmal Benachrichtigungen an Client
.
Front-end
und Home
haben im Grunde die gleiche API; Client
Möglicherweise wird eine Home
direkte Verbindung über LAN hergestellt. In diesem Fall Home
müssen einige Client
Aktionen auf einem Front-end
selbst 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-end
kehrt möglicherweise202 Accepted
zu einem asynchronen Aufruf zurück, um festzustellen, dass die erforderlicheHome
Verbindung unterbrochen ist und hätte vorhanden sein müssen503
. Home
muss Nachrichten an sendenClient
.Client
muss abfragenFront-end
oder 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?
quelle
@Jimmy Hoffa
gültiger Punkt, danke. Das stimmt, aber nicht ganz. Es ist eine gemeinsame Datenbank, Speicher und so weiter.@Javier
Danke, es ist ein guter Teil einer Antwort.@Mike Brown
genau. Bitte.Antworten:
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 .
quelle
@Javier
Kommentar 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.htmlHome
ist ein Benutzer-Heimgerät undClient
ein Smartphone über WLAN oder 3G. Ein großer Teil der Frage ist meine Unkenntnis über NAT-Traversal-Methoden.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.
quelle