RabbitMQ - Solution Middleware Orienté Message

RabbitMQ est une solution de middleware orienté messages. Un middleware est un logiciel permettant de créer un réseau d'échange d'informations entre applications.
RabbitMQ implémente le protocole AMQP (http://fr.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol) pour gérer la transmission des messages.
Les principes du protocole AMQP sont : orienté message, utilisation de files d'attente, routage (possibilité de définir avec une seule file d'attente des destinataires différents), fiabilité et sécurité.
RabbitMQ propose ainsi les services suivants :
- Un serveur de messagerie « broker » qui reçoit les messages transmis par un « producteur de message » et les route vers un ou plusieurs « consommateurs de message » ;
- Des API clients pour communiquer avec le broker.
RabbitMQ est disponible pour la plupart des systèmes d'exploitation (Solaris, BSD, Linux, MacOS, Windows, ….) et fournit des implémentations pour tous les langages modernes (Java, Scala, Ruby, Python, .Net, PHP, ...).
Exemples des files d'attente proposées par RabbitMQ
File d'attente simple
Dans cet exemple, le système est composé d'un producteur de message et d'un consommateur. Tous les messages sont transmis au consommateur connecté à RabbitMQ. Dans le cas où aucun consommateur n'est connecté, les messages peuvent être soit conservés dans la file d'attente jusqu'à la prochaine connexion d'un consommateur, soit supprimés.
File d'attente distribuée
Dans cet exemple, deux consommateurs écoutent la file d'attente. Cela permet d'éviter les ralentissements lorsque le producteur envoie beaucoup de messages et que la tâche de traitement d'un message par un consommateur est longue. Les messages sont donc répartis sur tous les consommateurs disponibles.
File d'attente multi-consommateurs
Dans cet exemple, l'objectif est de pouvoir envoyer l'ensemble des messages à tous les consommateurs qui écoutent la file d'attente. C'est RabbitMQ qui se charge de créer des « files d'attente virtuelles » pour chaque consommateur enregistré.
Routage de messages
Dans cet exemple, l'objectif est de pouvoir transmettre certains messages spécifiques à chaque consommateur. Dans le schéma, le consommateur C2 reçoit tous les messages alors que le consommateur C1 ne reçoit que les messages de type « error ».
Exemple d'utilisation
Un exemple classique de mise en œuvre est la délégation de traitements « lourds » dans les sites à forte audience (Ex : les envois de mail).
Lors de la soumission d'un formulaire d'inscription par un internaute ou lors de la validation d'une commande sur un site de e-commerce, il est plus judicieux et moins consommateur que le serveur web écrive un message dans une file RabbitMQ au lieu de construire le corps du mail et de faire l'envoi de celui-ci.
Du point de vue de l'internaute, cela est transparent car le mail sera envoyé par le premier consommateur disponible sur la file RabbitMQ.
Du point de vue du serveur web, celui-ci aura mis moins de temps et moins de ressources pour traiter la requête de l'internaute.
Cas concret d'utilisation chez France Télévisions Edition Numérique
Nous devions interfacer quatre applications que nous maintenons avec une nouvelle API interne à FTVEN.
Nous avons privilégié la mise en place d'une solution se basant sur RabbitMQ. Ainsi, au lieu de faire évoluer fortement (et donc de maintenir par la suite) les quatre applications pour qu'elles communiquent avec l'API, nous nous sommes contentés de les faire évoluer afin qu'elles écrivent un message dans RabbitMQ. Ensuite, nous avons développé un consommateur qui se charge de toutes les règles métier et de la communication avec l'API.
Cette approche permet en plus une meilleure scalabilité car si le flux de messages à traiter est important, il suffit de lancer plusieurs instances du consommateur sur la file d'attente RabbitMQ.
Plus d’info :
Arnaud G
Commentaires
Ajouter un commentaire