Microservices REST ou AMQP, auquel cas

15

J'ai lu de nombreux articles concernant l'architecture des microservices et je me demandais quand utiliser AMQP ou REST.

J'ai lu que le couplage lâche entre les services est une bonne chose et AMQP semble être un bon choix dans ce cas. Mais si nous utilisons AMQP, cela signifie que nous n'avons plus besoin de points de terminaison REST (mais cela signifie que nous perdons le concept HATEOAS).

Mais REST est-il vraiment un bon moyen de développer mes services? Parce que je n'utiliserai aucun endpoints ... Dans quel cas l'un est meilleur que l'autre?

Quand dois-je utiliser l'un ou l'autre?

Thomas thomas
la source

Réponses:

10

En jetant REST, vous perdez bien plus que HATEOAS. Si vos microservices sont publics (et c'est une bonne idée qu'ils soient publics ou du moins tendent à l'être un jour¹), utiliser autre chose que REST et SOAP serait problématique:

  • Certains développeurs n'ont jamais utilisé AMQP,

  • Certains ont utilisé AMQP, mais sont souvent beaucoup plus familiers avec REST et SOAP,

  • Les bibliothèques AMQP pour certaines langues ne sont pas particulièrement simples,

  • L'expérimentation manuelle du service est très limitée: je peux utiliser CURL pour faire n'importe quelle demande à Amazon S3; que dois-je installer sur ma machine si je veux jouer avec une variante AMQP de S3?

  • Le débogage de REST et SOAP est facile. Je viens de suivre les échanges HTTP et de les analyser. Je ne sais pas quels outils dois-je utiliser pour voir pour déboguer les échanges AMQP.

AMQP est génial, mais il est fait dans un but très spécifique d'échanges basés sur des événements. Bien qu'il soit techniquement possible de faire du RPC avec AMQP, ce n'est pas son objectif principal.

L'aspect asynchrone est également important. Parfois, c'est un avantage: je ne veux pas bloquer l'interface utilisateur d'une application lorsque je fais des requêtes aux serveurs. Parfois, cela rend les choses plus difficiles qu'elles ne devraient l'être: si j'ai besoin de récupérer une sauvegarde de fichiers à partir d'Amazon S3 parce que la sauvegarde locale a été corrompue, puis de restaurer la sauvegarde, mon fichier de commandes a nécessairement besoin de CURL pour terminer son travail avant de continuer, et une opération synchrone (avec un délai d'attente spécifique) est parfaitement logique.

Gardez REST pour les opérations principales:

  • Obtenir un produit,

  • Stocker une facture,

et utilisez AMQP pour les tâches où la messagerie a du sens:

  • Traiter toutes les factures à partir de septembre et avertir l'application lorsque le rapport est prêt à être affiché (étant donné que l'opération prend généralement de deux à dix minutes),

    L'avantage d'AMQP ici est son aspect asynchrone. Une requête HTTP en attente pendant dix minutes a de bonnes chances de provoquer un délai d'attente et d'autres problèmes.

  • Envoi des informations selon lesquelles les sauvegardes ont été corrompues à tous ceux qui pourraient être intéressés, tels que les personnes de support, les administrateurs de base de données, l'équipe de surveillance, les développeurs de l'application qui utilise cette base de données, etc.

    L'avantage d'AMQP ici est, entre autres, la possibilité d'ajouter les abonnés sans changer l'application qui suit les sauvegardes et déclenche l'alerte lorsqu'elle en trouve une corrompue.


¹ Un service Web public n'est pas nécessairement utilisé par des utilisateurs extérieurs à une entreprise. Dans les grandes ou moyennes entreprises, votre service est souvent utilisé par d'autres divisions de la même entreprise et a les mêmes exigences que celui qui serait utilisé par un tiers: il doit se méfier de tout appel (le fait qu'un gars que vous n'avez jamais entendu dire qui appelle votre service travaille dans la même entreprise que vous ne signifie pas qu'il n'exploitera pas ses problèmes de sécurité), cela doit être documenté correctement (parce que le même Indien ne connaît pas nécessairement votre numéro de téléphone et pas nécessairement connaître l'anglais), etc.

Arseni Mourzenko
la source
Qu'en est-il du chargement d'objets dépendants à l'aide d'AMQP? Comme l'utilisateur lié à un service de facturation (dans une architecture de microservices massive), une force pour l'accès asynchronicity VS REST hateoas (synchroneous)?
Thomas thomas
5

Utilise les deux.

Les services Web JSON de style REST sont parfaits pour l'interopérabilité avec javascript, ios, etc.

AMQP est idéal pour les processus, événements et orchestration de longue durée des microservices.

Mais les deux ne sont que des enveloppes de communication pour le service réel, vous pouvez exposer le même service de plusieurs manières et vous devriez probablement le faire.

AMPQ peut fonctionner correctement sur les Websockets, ce qui peut ressembler à un point de terminaison REST si vous plissez les yeux.

Ewan
la source
1
"si vous plissez les yeux" lol, c'était super.
Iain Duncan
0

REST est une technologie standard particulièrement adaptée à l'interopérabilité entre les composants - c'est l'élément clé, idéal pour créer un service Web que quelqu'un d'autre peut consommer. Cependant, il souffre des problèmes habituels d'une telle interopérabilité en ce qu'il est moins efficace qu'un protocole personnalisé.

Si vous écrivez une architecture dorsale où les services ne sont consommés que par vous-même, alors vous pouvez utiliser le protocole que vous aimez - vous n'êtes plus contraint d'utiliser un protocole aussi interopérable. Vous pouvez utiliser un MQ ou quelque chose de plus étroitement couplé et performant. Celui que vous utilisez dépend de votre cas d'utilisation, un bus de messages est très bon pour un ensemble distribué de services qui traitent des données où le client ne se soucie pas de qui reçoit les messages qu'il envoie.

gbjbaanb
la source
2
Je ne suis pas d'accord, en ce qui me concerne, ils ont des objectifs croisés; vous (généralement) ne devez pas exposer AMQP sur Internet public; il a beaucoup moins de fonctionnalités d'authentification pour une chose, et généralement les utilisateurs d'Internet publics veulent des réponses de leurs activités. REST est idéalement adapté à l'utilisation d'Internet public pour cette raison. Cependant, la plus grande différence est que AMQP est asynchrone (des comportements similaires à synchrones sont possibles, mais ce n'est pas à cela que servent les MQ), et REST est synchrone (oui, le retour 202dicte l'asynchronie, mais pourquoi avez-vous utilisé REST alors? Probablement parce qu'il est public.)
Jimmy Hoffa du
Sur une note latérale, exposer AMQP pour une utilisation websocket afin que les utilisateurs obtiennent des push en temps réel en direct au lieu d'avoir à interroger est en fait une raison de faire AMQP public; mais encore une fois: des objectifs croisés, vous ne faites pas REST pour que les consommateurs puissent être poussés, c'est un autre scénario où vous utilisez AMQP pour quelque chose que REST ne peut pas faire.
Jimmy Hoffa du
@JimmyHoffa J'ai pensé qu'il demandait quoi utiliser pour connecter ses serveurs Web ou clients ou quoi que ce soit à ses microservices sur un LAN interne, pas sur le Web - d'où mon point de vue que REST est bon pour cela, mais si tout ce que vous utilisez est sous votre contrôle, vous pouvez utiliser ce que vous voulez.
gbjbaanb
Ouais, c'est logique à coup sûr; J'ai lu sa question différemment cependant: il semble qu'il ait lu l'idée des microservices et ne comprend pas les raisons pertinentes pour choisir AMQP vs REST. En interne, vous pouvez utiliser ce que vous voulez, mais il y a encore des raisons spécifiques d'utiliser AMQP vs REST même en interne; les services qui souhaitent asynchroniser devraient utiliser AMQP en interne, les services synchrones (pensez à un service de traitement pur: données brutes entrantes -> données traitées sortantes) devraient être REST. Il y a des avantages et des inconvénients distincts pour les deux techniciens IPC, vous les connaissez et devez les énumérer dans votre réponse! :)
Jimmy Hoffa
0

AMQP prend également en charge la communication point à point (par exemple, voir le python-qpid-protondidacticiel). Vous pouvez implémenter une interface RESTful en utilisant cela, depuis REST !=HTTP.

AMQP fonctionne également beaucoup mieux que HTTP.

Cochise Ruhulessin
la source