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 en messagerie open-source, distribué et évolutif, qui sert d’intermédiaire pour une communication efficace entre les producteurs et les consommateurs.
RabbitMQ met en œuvre le protocole de messagerie de la couche application AMQP, qui est axé sur la communication de messages asynchrones avec une garantie de livraison par le biais de confirmations de réception des 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 stockent 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 par le biais de messages.
Comme pour 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 récepteur.
Comprenons mieux comment cela fonctionne en connaissant les types d’échanges représentant l’échange de messages.
Types d’échanges
Grâce aux échanges, chaque fois que nous envoyons un message via RabbitMQ, nous ne l’envoyons pas directement à une file d’attente ; pour que d’autres systèmes puissent le lire, nous l’envoyons à un échange, qui est responsable de l’acheminement des messages vers différentes files d’attente.
Les types d’échange sont Direct, Fanout, Topic et Readers.
Échange direct
Supposons qu’un producteur doive envoyer un message de confirmation d’achat à trois consommateurs. En d’autres termes, 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 est possible de faire en sorte 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. C’est pourquoi il existe plusieurs conditions que nous pouvons appliquer pour faire fonctionner un échange.
Ainsi, votre message peut être envoyé à un seul consommateur, au lieu d’être envoyé à tous.
Clé de liaison: Pour connecter une file d’attente à un échange, vous devez créer un bind, 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é permettant de transmettre nos messages à 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 livré 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 aussi avoir des relations différentes avec les échanges en utilisant les clés de routage.
Échange Fanout
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 en éventail, toutes les files d’attente recevront le message qui a été envoyé.
Echange de sujets
Il s’agit de l’un des échanges les plus flexibles, qui permet d’envoyer des messages en fonction du sujet. En fonction de la manière 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 une norme pour les intergiciels, contrairement à JMS, qui définit une API.
Un consortium international, comprenant de grandes entreprises comme Red Hat, Cisco Systems et Microsoft, a rédigé la spécification AMQP. La seconde est l’interopérabilité de ce protocole, qui permet à toute application mettant en œuvre 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 mis en œuvre et/ou pris en charge par RabbitMQ.
Les meilleures caractéristiques de RabbitMQ
En plus de permettre l’intégration de différentes applications par le biais de messages asynchrones et provenant de différents endroits, RabbitMQ offre d’autres caractéristiques 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. Il fournit notamment 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 instance différente du consommateur ou d’être traité à nouveau par le même consommateur qui a initialement échoué lorsqu’il se rétablit.
RabbitMQ garantit également l’ordre de livraison des messages, c’est-à-dire qu’ils sont consommés dans l’ordre dans lequel ils sont arrivés dans les files d’attente RabbitMQ.
Création de clusters
Bien que RabbitMQ offre de grandes performances en traitant des milliers de messages par seconde, il doit parfois être en mesure de traiter un plus grand nombre de messages sans affecter les performances de l’application.
Pour cela, RabbitMQ permet la création de clusters afin de faire évoluer la solution horizontalement, ce qui est transparent pour les producteurs et 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, ce qui garantit qu’en cas de défaillance d’un nœud ou de temps d’arrêt, le courtier peut continuer à recevoir les messages des producteurs et les délivrer 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, par le biais de liaisons.
Prise en charge de plusieurs protocoles
Outre le protocole AMQP, RabbitMQ prend en charge STOMP, MQTT et HTTP par le biais de modules d’extension. 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 sont la garantie de l’asynchronisme entre les applications, la réduction du couplage entre les applications, la distribution d’alertes et le contrôle de la file d’attente des travaux en arrière-plan.
Cependant, les cas d’utilisation pratiques de RabbitMQ se trouvent dans le commerce électronique, où il est utilisé pour manipuler, traiter et transmettre vos commandes de vente à des systèmes dans 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, en suivant le modèle asynchrone pour l’envoi de messages, mais il est souvent possible d’envoyer une action à plusieurs files d’attente.
Pour reprendre 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 comme chacun de ces secteurs est un système différent, l’objectif de RabbitMQ est de transmettre tous ces messages aux systèmes correspondants.
Les alternatives à Rabbit MQ :
RabbitMQ est beaucoup plus simple qu’il n’y paraît, et il existe plusieurs alternatives à ce système :
#1. IronMQ
IronMQ est un logiciel de mise en file d’attente de messages ultra-rapide. Il est hautement disponible, durable dans sa conception, et de préférence pour une livraison unique. IronMQ est la solution cloud-native la plus puissante pour l’architecture d’application moderne.
Elle prend en charge les files d’attente “push”, les files d’attente “pull” et les “long polls”, qui permettent de maintenir les demandes d’interrogation ouvertes plus longtemps. En outre, elle peut utiliser plusieurs centres de données à haute disponibilité, ce qui facilite l’évolutivité.
Vous pouvez le déployer dans le nuage, sur du matériel partagé ou dédié, ou sur site. Il dispose également d’une gamme de bibliothèques client avec une documentation facile à lire.
#2. Apache Kafka
Kafka est une plateforme très présente dans le domaine du streaming d’événements distribués. À la base, Kafka est conçu comme un journal de validation répliqué, distribué et persistant.
Sa plus grande utilité est d’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 assurer la tolérance aux pannes et la haute disponibilité.
#3. Apache ActiveMQ
ActiveMQ est un courtier en messages multiprotocole basé sur Java. Il permet d’intégrer des applications utilisant le protocole de mise en file d’attente des messages AMQP au niveau de la couche d’application.
Il met en œuvre plusieurs protocoles d’intégration, tels que JMS (natif de Java) et Stomp (qui peut être utilisé par des applications PHP), entre autres.
En outre, Amazon dispose d’une version “gérée” appelée Amazon MQ, qui facilite grandement l’utilisation du service.
Le mot de la fin
Les courtiers de messagerie ont toujours été un élément important de l’architecture des organisations. Cependant, avec l’augmentation du nombre d’utilisateurs entrant dans les systèmes de l’entreprise par différents canaux, il est nécessaire d’avoir des produits qui leur permettent d’être mis à l’échelle horizontalement à faible coût. Permettre 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 quelques plateformes d’hébergement RabbitMQ fiables pour votre application.