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 REST endpoints) (mais cela signifie que nous perdons le concept HATEOAS).
Mais REST est-il vraiment un bon moyen de créer mes services? Parce que je n'utiliserai aucun point de terminaison ... Dans ce cas, l'un est meilleur que l'autre?
Quand dois-je utiliser l'un ou l'autre?
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 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.
Conserver 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.
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).
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.
AMQP prend également en charge la communication point à point (par exemple, consultez le python-qpid-proton
Didacticiel). Vous pouvez implémenter une interface RESTful en utilisant cela, puisque REST !=
HTTP.
AMQP fonctionne également beaucoup mieux que HTTP.