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

Xavier
Nous utilisons également RabbitMQ sur notre projet afin de rendre asynchrones une partie de nos échanges avec une API externe (descente des données d'usage dans notre moteur de recommandation). Cela diminue le couplage et la dépendance vis à vis d'un système tiers. Cela fonctionne très bien; on a juste des difficultés à accéder aux messages en erreur dans la file depuis la console Rabbit (paramétrage en cours par les exploitants)
YvesM
Intéressant ! On regarde RabbitMQ aussi au Monde.
yves
Merci pour cet article intéressant, Concernant le stockage des messages, comment ça se passe : c'est un stockage persistant ou en RAM ? Est-ce que tu sais si c'est facile de le configurer pour ne pas avoir de perte de message en cas de problème sur la machine ? Je vois sur leur site que RabbitMQ propose un plugin de monitoring. Dans ton cas d'utilisation chez France Télévision, est-ce que vous l'utilisez ? As-tu des remarques dessus (suffisamment complet, clair, ...) ?
Arnaud
@yves le stockage est en RAM et je ne suis pas sûr qu'on puisse persister les messages. Ce qui veut dire qu'on perd les messages si la machine est down. En même temps le principe est d'échanger des messages "volatiles" pour engendrer des traitements. Il faut voir ce mécanisme comme du push ou de la notification

Ajouter un commentaire

Tags: