web-dev-qa-db-fra.com

REST ou une file d'attente de message dans un système hétérogène multi-niveaux?

Je concevons A REST API pour un système de trois niveaux similaire à: Client application -> Front-end API cloud server -> user's home API server (Home).

Home est un appareil à domicile et est censé maintenir la connexion à Front-end via Websocket ou à un long sondage (c'est le premier endroit où nous violons Repos. Il devient encore pire plus tard) . Front-end Surtout tunnels Client Demandes à Home Connexion et gère certains des appels lui-même. Parfois Home envoie des notifications à Client.

Front-end Et Home ont fondamentalement la même API; Client peut se connecter à Home directement, sur LAN. Dans ce cas, Home doit enregistrer quelques actions Client actions sur un Front-end Elle-même.

Avantages pour REST dans ce système sont les suivants:

  • Le repos est lisible par l'homme;
  • Le repos a une cartographie bien définie de verbes (comme CRUD), des noms et des codes de réponse aux objets de protocole;
  • Il fonctionne sur http et passe tous les proxies possibles;

Les contras de repos sont:

  • Nous avons non seulement besoin d'un style de communication de requête-réponse, mais également d'une publication-souscription;
  • Les codes d'erreur HTTP peuvent être insuffisants pour gérer les erreurs de communication à trois niveaux; Front-end Peut retourner 202 Accepted À un appel ASYNC uniquement pour savoir que la connexion Home est cassée et qu'il aurait dû être 503;
  • Home doit envoyer des messages à Client. Client _ devra sonder Front-end ou pour maintenir une connexion.

Nous envisageons [~ # ~ # ~] wamp [~ # ~] / Autobahn sur Websocket pour obtenir des fonctionnalités de publication/abonnement, quand il m'a frappé qu'il ressemble déjà à un message file d'attente.

Cela vaut-il la peine d'évaluer une sorte de file d'attente de messagerie en tant que transport?

On dirait que les contras de la file d'attente de messages sont les suivants:

  • Je devrai définir des verbes crud et des codes d'erreur moi-même sur un niveau de message.
  • J'ai lu quelque chose sur "coût d'entretien plus élevé", mais que signifie-t-il?

quelle est la gravité de ces considérations?

9
Victor Sergienko

Si vous avez la connectivité, accédez à une file d'attente de message - bien que vous devez définir vos propres protocoles (tâche difficile!) Pour envoyer des messages d'une structure et d'un format particulier.

Le problème avec la maintenance est que typiquement le client et le serveur sont construits séparément, vous devez veiller à conserver les deux extrémités à l'aide des 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 Service.

Si vous avez des problèmes de connectivité via Internet, les comms de port 80 et http uniquement et "unidirectionnel", alors A REST SYSTEM est probablement le meilleur. Envoyer et sondage, ou obtenir une bande Web pour rappeler Les données, mais généralement architecte votre système être client/serveur. Si vous avez la possibilité d'obtenir la connectivité, les systèmes de messagerie sont super.

J'irais avec Zeromq pour un système de messagerie, son suffisamment configurable pour tordre de toutes sortes de scénarios, y compris ceux tolérants de panne. Je ne suis pas sûr que cela fonctionne sur http cependant.

5
gbjbaanb

On dirait que Autobahn convient parfaitement à ce que vous essayez de faire. Il y a d'autres outils disponibles également. Consultez le Bus de service Windows Azure (qui contient des frameworks client pour Java, .NET, PHP, Python, Nodejs et Ruby).

Tandis que les messages de repos intégrés sont utiles. Vous constaterez que votre application dépassera les opérations de base du crud. Par exemple, si votre demande était un système bancaire. À la place de

Mise à jour ACCT 54321 Balance = Balance - 20h00 Mise à jour ACCT 98765 Balance = Balance + 20,00

Vous voulez probablement un seul message comme

Transférer 20,00 du compte 54321 au compte 98765

Il est préférable que vous découvriez cet obstacle avec REST maintenant plutôt que plus tard. Découvrez Greg Young événement centrique qui explique comment créer un modèle plus riche pour la messagerie dans votre application.

5
Michael Brown