RabbitMQ expliqué en 5 minutes ou moins



Découvrons ensemble comment optimiser le temps de chargement de vos pages web en déléguant les opérations les plus gourmandes en ressources à un traitement asynchrone. Nous utiliserons pour cela RabbitMQ, un outil de gestion particulièrement simple.

La stabilité et la vitesse d’une application ou d’un site web sont des éléments déterminants pour l’expérience utilisateur. Qui n’a jamais quitté une page web parce que le temps de chargement était trop long ?

Qu’est-ce que RabbitMQ ?

RabbitMQ est un courtier de messages open source, distribué et adaptable. Il sert d’intermédiaire pour une communication efficace entre les producteurs et les consommateurs de messages.

RabbitMQ met en œuvre le protocole de messagerie AMQP (Advanced Message Queuing Protocol), qui garantit la communication asynchrone de messages avec une confirmation de réception. Cette confirmation assure que le message a bien été reçu par le courtier et par le consommateur.

Comment fonctionne RabbitMQ ?

De manière simplifiée, RabbitMQ utilise des files d’attente pour stocker les messages envoyés par les producteurs. Ces messages restent en attente jusqu’à ce que les applications consommatrices les récupèrent et les traitent. Cette approche permet de concevoir et de mettre en œuvre des systèmes distribués, composés de modules indépendants qui communiquent via des échanges de messages.

Comme dans toute communication, il faut un émetteur (producteur), un message et un récepteur (consommateur). RabbitMQ agit comme un intermédiaire, un lieu où les messages attendent d’être pris en charge par leur destinataire.

Pour mieux comprendre son fonctionnement, examinons les différents types d’échanges de messages.

Types d’échange

Avec RabbitMQ, l’envoi d’un message ne se fait pas directement vers une file d’attente. Au lieu de cela, le message est envoyé à un échange, qui se charge de le transférer vers les différentes files d’attente concernées.

Crédit image : CloudAQMP

On distingue principalement quatre types d’échanges : Direct, Fanout, Topic et Headers.

Échange direct

Prenons l’exemple d’un producteur devant envoyer une confirmation d’achat à trois consommateurs différents. Le système doit donc communiquer avec trois autres systèmes pour valider l’achat.

RabbitMQ envoie chaque message séparément à chaque file d’attente, ce qui permet aux systèmes destinataires de recevoir le message de manière directe.

En général, l’échange transmet le message aux files d’attente. Cependant, il est parfois nécessaire de ne pas envoyer un message à toutes les files d’attente. Plusieurs conditions peuvent être appliquées pour affiner le routage des messages.

Il est ainsi possible de cibler un seul consommateur, au lieu de diffuser le message à tous.

Clé de liaison : pour associer une file d’attente à un échange, il faut établir une liaison. Il s’agit d’une relation entre une file d’attente et un échange.

Clé de routage : la liaison peut également inclure une clé de routage. Cette clé sert à diriger un message vers une file d’attente spécifique.

Si vous avez les clés de routage X, Y et Z, un message avec la clé de routage Y sera transmis à la file d’attente Y et sera remis au consommateur désigné.

De cette manière, plusieurs files d’attente peuvent être connectées à un même échange, tout en conservant des relations différentes grâce aux clés de routage.

Échange de diffusion

Dans ce type d’échange, tout message envoyé est transmis à toutes les files d’attente qui y sont connectées. Si 10 files d’attente sont connectées à un échange de diffusion, elles recevront toutes le message envoyé.

Échange de sujets

C’est l’un des types d’échange les plus flexibles. Il permet d’envoyer des messages en fonction de leur sujet. En utilisant un système de nommage des clés de routage, il est possible de créer des modèles de règles et de relations entre les différents systèmes.

Par exemple : clé de routage (x.*) ; clé de routage (*.z) ; clé de routage (*.y.*).

Qu’est-ce que l’AMQP dans RabbitMQ ?

AMQP (Advanced Message Queuing Protocol) est un protocole de messagerie ouvert utilisé pour définir le transport de messages entre différentes applications. Similaire aux protocoles HTTP et TCP, il s’agit d’un protocole de niveau filaire qui permet le transport asynchrone de messages.

RabbitMQ a choisi d’implémenter AMQP pour plusieurs raisons. Tout d’abord, ce protocole est un standard pour les intergiciels, contrairement à JMS qui définit une API.

La spécification AMQP a été rédigée par un consortium international regroupant de grandes entreprises comme Red Hat, Cisco Systems et Microsoft. Ensuite, ce protocole favorise l’interopérabilité, permettant à toute application implémentant AMQP de communiquer avec un courtier AMQP.

AMQP n’est pas le seul protocole utilisé par RabbitMQ. L’image ci-dessous représente tous les protocoles, langages et API pris en charge par RabbitMQ.

Les atouts de RabbitMQ

En plus de faciliter l’intégration d’applications via des échanges de messages asynchrones depuis différents emplacements, RabbitMQ offre d’autres fonctionnalités qui ont contribué à sa popularité dans le domaine des courtiers de messages :

Stockage fiable

RabbitMQ intègre plusieurs mécanismes garantissant la livraison des messages. Il prévoit notamment un stockage temporaire lorsqu’aucun consommateur n’est disponible pour traiter le message. Il permet également aux consommateurs de confirmer la bonne réception du message après son traitement.

En cas d’échec de traitement, RabbitMQ peut remettre le message en file d’attente pour qu’il soit traité par une autre instance du consommateur, ou à nouveau par le même consommateur.

RabbitMQ assure également l’ordre de livraison des messages, garantissant qu’ils sont consommés dans l’ordre où ils ont été reçus dans les files d’attente.

Création de clusters

Bien que RabbitMQ offre d’excellentes performances, il est parfois nécessaire de traiter un volume de messages encore plus important. Pour cela, RabbitMQ permet de créer des clusters afin de faire évoluer la solution horizontalement, sans impacter les producteurs ou les consommateurs.

Files d’attente haute disponibilité

Les files d’attente RabbitMQ peuvent être répliquées sur plusieurs nœuds d’un cluster. Cela garantit qu’en cas de panne d’un nœud, le courtier reste opérationnel, continue de recevoir les messages des producteurs et de les transmettre aux consommateurs.

Routage flexible

RabbitMQ permet de définir des règles de routage flexibles, y compris par le biais de modèles, pour acheminer les messages entre les échanges et les files d’attente via des liaisons.

Prise en charge de plusieurs protocoles

En plus de prendre en charge le protocole AMQP, RabbitMQ prend également en charge STOMP, MQTT et HTTP via des plugins. Il intègre également des mécanismes d’authentification et de contrôle d’accès pour chaque courtier.

Cas d’utilisation concrets de RabbitMQ

Les principaux cas d’utilisation de RabbitMQ consistent à garantir l’asynchronicité entre les applications, à réduire le couplage entre les applications, à distribuer des alertes et à gérer les files d’attente de tâches en arrière-plan.

Un exemple pratique d’utilisation de RabbitMQ se trouve dans le commerce électronique, où il est utilisé pour gérer, traiter et transmettre les commandes clients à d’autres systèmes, tels que la distribution et la facturation.

Lors du traitement d’une commande, il est possible de transmettre un message de vente au centre de distribution et à la zone de facturation. Tout fonctionne horizontalement, selon un modèle asynchrone. Il est fréquent d’envoyer une action à plusieurs files d’attente.

Dans l’exemple précédent, cela est particulièrement utile lorsqu’un client effectue un achat et que le produit doit être préparé pour la distribution, le transport et la facturation.

Chacun de ces systèmes étant différent, RabbitMQ permet de transmettre les messages correspondants à chacun d’eux.

Alternatives à RabbitMQ :

RabbitMQ est bien plus simple qu’il n’y paraît. Il existe plusieurs alternatives, notamment :

#1. IronMQ

IronMQ est un système de gestion de files d’attente de messages très performant. Il est hautement disponible, durable et privilégiant une livraison unique. IronMQ est une solution cloud native idéale pour l’architecture d’applications modernes.

Il prend en charge les files d’attente push et pull ainsi que le long polling, qui maintient les requêtes de polling ouvertes plus longtemps. Il peut également utiliser plusieurs centres de données haute disponibilité, facilitant ainsi l’évolutivité.

Le déploiement peut se faire dans le cloud, sur du matériel partagé ou dédié, ou sur site. IronMQ propose une gamme de bibliothèques clientes avec une documentation facile à lire.

#2. Apache Kafka

Kafka est une plateforme largement utilisée pour le streaming d’événements distribué. Son architecture repose sur un journal de validation répliqué, distribué et persistant.

Il est particulièrement adapté à l’alimentation de microservices pilotés par événements ou d’applications de traitement de flux à grande échelle. Il réplique automatiquement les événements de manière asynchrone au sein du cluster, assurant ainsi la tolérance aux pannes et la haute disponibilité.

#3. Apache ActiveMQ

ActiveMQ est un courtier de messages multi-protocole basé sur Java. Il permet d’intégrer des applications utilisant le protocole de mise en file d’attente de messages AMQP.

Il implémente plusieurs protocoles d’intégration, comme JMS (Java natif) et Stomp (utilisable par des applications PHP), entre autres.

Amazon propose également sa version « gérée » appelée Amazon MQ, qui facilite grandement l’utilisation du service.

Conclusion

Les courtiers de messages ont toujours joué un rôle important dans l’architecture des organisations. Avec l’augmentation du nombre d’utilisateurs accédant aux systèmes d’entreprise par différents canaux, il devient essentiel de pouvoir mettre à l’échelle horizontalement à faible coût, en traitant un grand nombre de messages par seconde.

C’est là qu’une nouvelle génération de courtiers, comme RabbitMQ, prend toute son importance dans les applications modernes. Ils offrent une disponibilité, une fiabilité, une interopérabilité et des performances élevées pour nos clients.

N’hésitez pas à explorer des plateformes d’hébergement RabbitMQ fiables pour votre application.