Je conçois une API REST pour un système à trois niveaux comme: Client application
-> Front-end API cloud server
-> user's home API server (Home)
.
Home
est un appareil domestique, et est censé maintenir la connexion Front-end
via Websocket ou un long sondage (c'est le premier endroit où nous violons REST. Il empire encore plus tard) . Front-end
tunnelise principalement les Client
demandes de Home
connexion et gère certains appels lui-même. Envoie parfois Home
des notifications à Client
.
Front-end
et Home
ont essentiellement la même API; Client
peut se connecter Home
directement sur LAN. Dans ce cas, Home
doit enregistrer certaines Client
actions sur Front-end
lui - même.
Les avantages de REST dans ce système sont:
- REST est lisible par l'homme;
- REST a un mappage bien défini des verbes (comme CRUD), des noms et des codes de réponse aux objets de protocole;
- Il fonctionne sur HTTP et passe tous les proxy possibles;
Les contras REST sont:
- Nous avons besoin non seulement d'un style de communication demande-réponse, mais également d'un abonnement à la publication;
- Les codes d'erreur HTTP peuvent être insuffisants pour gérer les erreurs de communication à trois niveaux;
Front-end
peut revenir202 Accepted
à un appel asynchrone uniquement pour découvrir que laHome
connexion nécessaire est rompue et qu'il aurait dû y en avoir503
; Home
doit envoyer des messages àClient
.Client
devra interrogerFront-end
ou maintenir une connexion.
Nous envisageons WAMP / Autobahn sur Websocket pour obtenir la fonctionnalité de publication / abonnement, quand il m'a semblé que cela ressemblait déjà à une file d'attente de messages.
Vaut-il la peine d'évaluer une sorte de file d'attente de messagerie comme moyen de transport?
On dirait que les contras de la file d'attente de messages sont:
- Je vais devoir définir moi-même les verbes CRUD et les codes d'erreur au niveau du message.
- J'ai lu quelque chose sur "des coûts de maintenance plus élevés", mais qu'est-ce que cela signifie?
Quelle est la gravité de ces considérations?
la source
@Jimmy Hoffa
point valable, merci. C'est vrai, mais pas complètement. Il s'agit d'une base de données, d'un stockage, etc. communs.@Javier
merci, c'est une bonne partie d'une réponse.@Mike Brown
exactement. Je vous en prie.Réponses:
Si vous avez la connectivité, optez pour une file d'attente de messages - même si vous devez définir vos propres protocoles (ce qui n'est pas une tâche difficile!) Pour envoyer des messages d'une structure et d'un format particuliers.
Le problème avec la maintenance est que généralement le client et le serveur sont construits séparément, vous devez donc faire attention à garder les deux extrémités en utilisant les mêmes définitions de message, mais si vous n'êtes pas assez organisé, utilisez simplement le même XML que vous utiliseriez dans votre REST un service.
Si vous avez des problèmes de connectivité sur Internet, avec les ports 80 et http uniquement et les communications «unidirectionnelles», un système de style REST est probablement le meilleur. Envoyez et interrogez, ou lancez une websocket pour les données de rappel, mais en règle générale, votre système doit être client / serveur. Si vous avez la possibilité d'obtenir la connectivité, les systèmes de messagerie sont parfaits.
J'irais avec ZeroMQ pour un système de messagerie, son assez configurable pour se tordre dans toutes sortes de scénarios, y compris ceux tolérants aux pannes. Je ne suis pas sûr que cela fonctionne sur http cependant.
la source
@Javier
commentaire: ØMQ ne semble pas prendre en charge le cryptage lui-même atm: zeromq.org/area:faq#toc8 bien que RabbitMQ le fasse: rabbitmq.com/ssl.htmlHome
est un appareil domestique etClient
est un smartphone via Wi-Fi ou 3G. Une grande partie de la question est mon ignorance des méthodes de traversée NAT.Il semble qu'Autobahn cadre bien avec ce que vous essayez de faire. Il existe également d'autres outils. Découvrez le bus de service Windows Azure (qui a des cadres clients pour Java, .NET, PHP, Python, NodeJS et Ruby).
Alors que les messages de repos intégrés sont utiles. Vous constaterez que votre application dépassera les opérations CRUD de base. Par exemple, si votre application était un système bancaire. Au lieu de
Mettre à jour Acct 54321 Balance = Balance - 20.00 Mettre à jour Acct 98765 Balance = Balance + 20.00
Vous voudriez probablement un seul message comme
Transférez 20,00 du compte 54321 vers le compte 98765
Il vaut mieux que vous découvriez cet obstacle avec REST maintenant plutôt que plus tard. Consultez Event Centric de Greg Young qui explique comment créer un modèle plus riche pour la messagerie au sein de votre application.
la source