RabbitMQ expliqué en 5 minutes ou moins

Nous allons voir aujourd’hui comment accélérer le temps de chargement de vos pages en exécutant les traitements les plus lourds de manière asynchrone, le tout géré très simplement, grâce à RabbitMQ.

La stabilité et la rapidité d’une application ou d’un site web sont certainement parmi les facteurs les plus importants pour les utilisateurs. Qui n’a jamais quitté un site avant même d’avoir vu la première page parce que cela prenait trop de temps ?

Qu’est-ce que RabbitMQ

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

RabbitMQ implémente le protocole de messagerie de couche application AMQP, qui se concentre sur la communication de messages asynchrones avec garantie de livraison via des confirmations de réception de messages du courtier au producteur et des consommateurs au producteur.

Comment fonctionne RabbitHQ

De manière simplifiée, RabbitMQ définit des files d’attente qui stockeront les messages envoyés par les producteurs jusqu’à ce que les applications consommatrices reçoivent le message et le traitent. Il nous permet de concevoir et de mettre en œuvre des systèmes distribués, dans lesquels un système est divisé en modules indépendants qui communiquent entre eux via des messages.

Comme toute communication, nous avons besoin d’un producteur, d’un message et d’un récepteur. Au milieu du gâteau se trouve RabbitMQ, qui serait l’endroit où le message attend le destinataire.

Comprenons mieux son fonctionnement en connaissant les types d’échanges représentant l’échange de messages.

Types d’échange

Grâce aux échanges, chaque fois que nous envoyons un message via RabbitMQ, nous ne l’envoyons pas directement dans une file d’attente ; pour que d’autres systèmes le lisent, nous l’envoyons à un échange, qui est chargé de transférer les messages vers différentes files d’attente.

Crédit image : CloudAQMP

Les types d’échanges sont Direct, Fanout, Topic et Readers.

Échange direct

Supposons qu’un producteur doive envoyer un message de confirmation d’achat à trois consommateurs. Autrement dit, le système doit communiquer avec trois autres systèmes différents pour effectuer l’achat.

Comme RabbitMQ envoie le message séparément à chaque file d’attente, il y a un élan pour que ces autres systèmes reçoivent le message directement.

Normalement, l’échange transmet le message aux files d’attente, mais nous ne voulons souvent pas que nos messages soient envoyés à toutes les files d’attente. Par conséquent, il y a plusieurs conditions que nous pouvons appliquer pour faire fonctionner un échange.

Vous pouvez donc envoyer votre message à un seul consommateur ; au lieu d’être envoyé à tout le monde.

Clé de liaison : pour connecter une file d’attente à un échange, vous devez créer une liaison, une relation entre une file d’attente et un échange, comme un connecteur.

Clé de routage : dans cette liaison, nous pouvons également créer un élément appelé clé de routage, qui, en d’autres termes, est une clé pour transférer nos messages vers une file d’attente spécifique.

Si vous avez une clé de routage X, une clé de routage Y et une clé de routage Z, le message avec la clé de routage Y, par exemple, passera par la file d’attente Y et sera remis directement au consommateur que vous avez défini pour recevoir le message.

De cette façon, nous pouvons avoir plusieurs files d’attente connectées à un échange, mais en même temps, elles peuvent également avoir des relations différentes avec les échanges en utilisant les clés de routage.

Échange de diffusion

Lorsque le message est envoyé à l’échange, il est envoyé à toutes les files d’attente qui y sont connectées. Ainsi, si vous avez 10 files d’attente connectées à un échange de sortance, toutes les files d’attente recevront le message qui a été envoyé.

Échange de sujets

C’est l’un des échanges les plus flexibles, nous permettant d’envoyer des messages en fonction du sujet. Et en fonction de la façon dont vous nommez les clés de routage, il est possible de créer des modèles de règles et de relations entre les systèmes.

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

Qu’est-ce que l’AQMP dans RabbitMQ

AMQP (Advanced Message Queuing Protocol) est un protocole de messagerie ouvert utilisé pour définir le transport de messages entre plusieurs applications. Il est similaire aux protocoles HTTP et TCP en ce sens qu’il s’agit d’un protocole de niveau filaire, sauf qu’il permet le transport asynchrone.

RabbitMQ a choisi d’implémenter AMQP pour plusieurs raisons. La première est que ce protocole est décrit comme un standard pour le middleware, contrairement à JMS qui définit une API.

Un consortium international, comprenant de grandes entreprises telles que Red Hat, Cisco Systems et Microsoft, a rédigé cette spécification AMQP. La seconde est l’interopérabilité de ce protocole, qui permet à 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 implémentés et/ou supportés par RabbitMQ.

Meilleures fonctionnalités de RabbitMQ

En plus de permettre l’intégration de différentes applications via des messages de manière asynchrone et à partir de différents emplacements, RabbitMQ nous offre d’autres fonctionnalités qui l’ont rendu très populaire dans le monde des courtiers de messagerie :

Stockage fiable

RabbitMQ intègre plusieurs fonctionnalités qui lui permettent de garantir la livraison des messages. Parmi ceux-ci, il fournit un stockage lorsqu’aucun consommateur ne peut recevoir le message. Il permet aux consommateurs d’accepter la livraison du message pour s’assurer qu’il a été traité avec succès.

Si le traitement échoue, RabbitMQ permet au message d’être remis en file d’attente pour être consommé par une autre instance du consommateur ou d’être traité à nouveau par le même consommateur qui a initialement échoué lors de sa récupération.

RabbitMQ garantit également l’ordre de livraison des messages ; c’est-à-dire qu’ils sont consommés dans le même ordre dans lequel ils sont arrivés dans les files d’attente RabbitMQ.

Création de grappes

Bien que RabbitMQ offre d’excellentes performances en traitant des milliers de messages par seconde, il doit parfois être capable de traiter un plus grand nombre de messages sans affecter les performances de l’application.

Pour cela, RabbitMQ permet la création de clusters pour faire évoluer la solution horizontalement, ce qui est transparent tant pour les producteurs que pour les consommateurs.

Files d’attente hautement disponibles

Dans RabbitMQ, les files d’attente peuvent être répliquées sur plusieurs nœuds d’un cluster, garantissant qu’en cas de panne ou d’indisponibilité d’un nœud, le courtier peut continuer à recevoir des messages des producteurs et les transmettre aux consommateurs appropriés.

Routage flexible

Dans RabbitMQ, des règles de routage flexibles peuvent être définies, même en suivant un certain modèle, 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 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 les composants de chaque courtier.

Cas d’utilisation réels de RabbitMQ

Les cas d’utilisation les plus importants de RabbitMQ permettent de garantir l’asynchronicité entre les applications, de réduire le couplage entre les applications, de distribuer des alertes et de contrôler la file d’attente des travaux en arrière-plan.

Cependant, les cas d’utilisation pratiques de RabbitMQ sont dans le commerce électronique, où t est utilisé pour manipuler, traiter et transmettre vos commandes client à des systèmes d’autres secteurs, tels que la distribution et l’émission de factures.

Lors du traitement des commandes, vous pouvez transmettre votre message de vente au centre de distribution et à une zone de facturation. Dans ce schéma, tout fonctionne horizontalement, suivant le modèle asynchrone d’envoi de messages, mais il est souvent possible d’envoyer une action à plusieurs files d’attente.

Suivant l’exemple précédent, cette fonction peut être très utile lorsque le client effectue un achat et que le produit doit être préparé pour la distribution, le transport et les factures.

Et puisque chacun de ces secteurs est un système différent, le but de RabbitMQ est de transmettre tous ces messages aux systèmes correspondants.

Alternatives au lapin MQ :

RabbitMQ est beaucoup plus simple qu’il n’y paraît, et il existe plusieurs alternatives qui incluent :

#1. FerMQ

IronMQ est un logiciel de file d’attente de messages ultra-rapide. Il est hautement disponible, de conception durable et de préférence pour une livraison unique. IronMQ est la solution cloud native la plus puissante pour l’architecture d’application moderne.

Il prend en charge les files d’attente push, les files d’attente pull et les sondages longs, ce qui maintient les demandes de sondage ouvertes plus longtemps. De plus, il peut utiliser plusieurs centres de données à haute disponibilité, ce qui facilite l’évolutivité.

Vous pouvez déployer dans le cloud, sur du matériel partagé ou dédié, ou sur site. Il dispose également d’une gamme de bibliothèques clientes avec une documentation facile à lire.

#2. Apache Kafka

Kafka est une plateforme très présente dans le streaming événementiel distribué. À la base, Kafka est conçu comme un journal de validation répliqué, distribué et persistant.

Sa plus grande facilité d’utilisation consiste à alimenter des microservices pilotés par les événements ou des applications de traitement de flux à grande échelle, en répliquant automatiquement les événements de manière asynchrone au sein du cluster pour une tolérance aux pannes et une haute disponibilité.

#3. Apache ActiveMQ

ActiveMQ est un courtier de messages multiprotocole basé sur Java. Avec lui, nous pouvons intégrer des applications utilisant le protocole de mise en file d’attente de messages AMQP au niveau de la couche application.

Il implémente plusieurs protocoles d’intégration, tels que JMS (Java natif) et Stomp (qui peut être utilisé par les applications PHP), entre autres.

De plus, Amazon a sa version « gérée » appelée Amazon MQ, ce qui facilite beaucoup l’utilisation du service.

Derniers mots

Les courtiers de messagerie ont traditionnellement été un élément important dans les architectures des organisations. Pourtant, avec l’augmentation du nombre d’utilisateurs entrant dans les systèmes de l’entreprise par différents canaux, des produits sont nécessaires qui leur permettent d’être mis à l’échelle horizontalement à faible coût. Permettant le traitement d’un grand nombre de messages par seconde.

C’est là qu’une nouvelle génération de courtiers, tels que RabbitMQ, devient plus pertinente dans les applications modernes, qui cherchent à offrir des niveaux élevés de disponibilité, de fiabilité, d’interopérabilité et de performance à nos clients.

Vous pouvez également explorer certaines plates-formes d’hébergement RabbitMQ fiables pour votre application.