Apache Kafka et RabbitMQ sont deux courtiers de messagerie très répandus qui permettent de découpler l’échange de messages entre les applications. Quelles sont leurs principales caractéristiques et qu’est-ce qui les différencie l’un de l’autre ? Voyons les concepts.
RabbitMQ
RabbitMQ est une application open-source de courtage de messages pour la communication et l’échange de messages entre parties. Comme il a été développé en Erlang, il est très léger et efficace. Le langage Erlang a été développé par Ericson et se concentre sur les systèmes distribués.
Il est considéré comme un courtier de messagerie plus traditionnel. Il est basé sur le modèle éditeur-souscripteur, bien qu’il puisse traiter les communications de manière synchrone ou asynchrone, en fonction de ce qui est défini dans la configuration. Il assure également la livraison et l’ordonnancement des messages entre les producteurs et les consommateurs.
Il prend en charge les protocoles AMQP, STOMP, MQTT, HTTP et web socket. Trois modèles d’échange de messages : par thème, en éventail et direct :
- Échange direct et individuel par sujet ou thème [topic]
- Tous les consommateurs connectés à la file d’attente reçoivent le message [fanout]
- Chaque consommateur reçoit un message envoyé [direct]
Les composants de RabbitMQ sont les suivants :
Producteurs
Les producteurs sont des applications qui créent et envoient des messages à RabbitMQ. Il peut s’agir de n’importe quelle application capable de se connecter à RabbitMQ et de publier des messages.
Consommateurs
Les consommateurs sont des applications qui reçoivent et traitent les messages de RabbitMQ. Il peut s’agir de n’importe quelle application capable de se connecter à RabbitMQ et de s’abonner à des messages.
Échanges
Les échanges sont chargés de recevoir les messages des producteurs et de les acheminer vers les files d’attente appropriées. Il existe plusieurs types d’échanges, notamment les échanges directs, les échanges de fanout, les échanges de sujets et les échanges d’en-têtes, chacun ayant ses propres règles de routage.
Files d’attente
Les files d’attente sont l’endroit où les messages sont stockés jusqu’à ce qu’ils soient consommés par les consommateurs. Elles sont créées par les applications ou automatiquement par RabbitMQ lorsqu’un message est publié sur un échange.
Liaisons
Les liaisons définissent la relation entre les échanges et les files d’attente. Elles spécifient les règles d’acheminement des messages, qui sont utilisées par les échanges pour acheminer les messages vers les files d’attente appropriées.
Architecture de RabbitMQ
RabbitMQ utilise un modèle “pull” pour la livraison des messages. Dans ce modèle, les consommateurs demandent activement les messages du courtier. Les messages sont publiés dans des échanges chargés d’acheminer les messages vers les files d’attente appropriées sur la base de clés de routage.
L’architecture de RabbitMQ est basée sur une architecture client-serveur et consiste en plusieurs composants qui fonctionnent ensemble pour fournir une plateforme de messagerie fiable et évolutive. Le concept AMQP prévoit les composants suivants : échanges, files d’attente, liaisons, ainsi que les éditeurs et les abonnés. Les éditeurs publient des messages vers les échanges.
Les échanges prennent ces messages et les distribuent à 0 à n files d’attente en fonction de certaines règles (bindings). Les messages stockés dans les files d’attente peuvent ensuite être récupérés par les consommateurs. Sous une forme simplifiée, la gestion des messages est effectuée dans RabbitMQ de la manière suivante :
- Les éditeurs envoient des messages à l’échange ;
- L’échange envoie des messages aux files d’attente et à d’autres échanges ;
- Lorsqu’un message est reçu, RabbitMQ envoie des accusés de réception aux expéditeurs ;
- Les consommateurs maintiennent des connexions TCP persistantes avec RabbitMQ et déclarent la file d’attente qu’ils reçoivent ;
- RabbitMQ achemine les messages vers les consommateurs ;
- Les consommateurs envoient des accusés de réception de succès ou d’erreur pour la réception du message ;
- En cas de bonne réception, le message est retiré de la file d’attente.
Apache Kafka
Apache K afka est une solution de messagerie distribuée open-source développée par LinkedIn en Scala. Elle est capable de traiter des messages et de les stocker avec un modèle éditeur-souscripteur avec une évolutivité et des performances élevées.
Pour stocker les événements ou les messages reçus, répartissez les sujets entre les nœuds à l’aide de partitions. Il combine les modèles éditeur-souscripteur et file d’attente de messages, et il est également chargé d’assurer l’ordre des messages pour chaque consommateur.
Kafka se spécialise dans un débit de données élevé et une faible latence pour gérer les flux de données en temps réel. Pour ce faire, il évite une trop grande logique du côté du serveur (courtier), ainsi que certains détails d’implémentation particuliers.
Par exemple, Kafka n’utilise pas du tout de mémoire vive et écrit les données immédiatement sur le système de fichiers du serveur. Comme toutes les données sont écrites de manière séquentielle, les performances en lecture-écriture sont comparables à celles de la RAM.
Ce sont les principaux concepts de Kafka qui le rendent évolutif, performant et tolérant aux pannes :
Sujet
Un sujet est une façon d’étiqueter ou de catégoriser un message ; imaginez un placard avec 10 tiroirs ; chaque tiroir peut être un sujet, et le placard est la plateforme Apache Kafka, donc en plus de le catégoriser, il regroupe les messages, une autre meilleure analogie concernant le sujet serait le classement dans les bases de données relationnelles.
Producteur
Le producteur est celui qui se connecte à une plateforme de messagerie et envoie un ou plusieurs messages sur un sujet spécifique.
Consommateur
Le consommateur est la personne qui se connecte à une plateforme de messagerie et consomme un ou plusieurs messages sur un sujet spécifique.
Courtier
Le concept de broker dans la plateforme Kafka n’est rien d’autre que pratiquement Kafka lui-même, et c’est lui qui gère les topics et définit la manière de stocker les messages, les logs, etc.
Cluster
Le cluster est un ensemble de Brokers qui communiquent entre eux ou non pour une meilleure évolutivité et tolérance aux pannes.
Fichier journal
Chaque thème stocke ses enregistrements sous forme de journal, c’est-à-dire de manière structurée et séquentielle ; le fichier journal est donc le fichier qui contient les informations d’un thème.
Partitions
Les partitions sont la couche de partitionnement des messages au sein d’un sujet ; ce partitionnement assure l’élasticité, la tolérance aux pannes et l’évolutivité d’Apache Kafka, de sorte que chaque sujet peut avoir plusieurs partitions à différents endroits.
Architecture d’Apache Kafka
Kafka est basé sur un modèle “push” pour la livraison des messages. Selon ce modèle, les messages dans Kafka sont activement poussés vers les consommateurs. Les messages sont publiés dans des rubriques, qui sont divisées et réparties entre différents courtiers dans le cluster.
Les consommateurs peuvent ensuite s’abonner à un ou plusieurs sujets et recevoir les messages au fur et à mesure qu’ils sont produits sur ces sujets.
Dans Kafka, chaque thème est divisé en une ou plusieurs partitions. C’est dans la partition que les événements aboutissent.
S’il y a plus d’un courtier dans le cluster, les partitions seront réparties uniformément entre tous les courtiers (dans la mesure du possible), ce qui permettra de répartir la charge d’écriture et de lecture d’un sujet sur plusieurs courtiers à la fois. Comme il s’agit d’un cluster, il utilise ZooKeeper pour la synchronisation.
Il reçoit, stocke et distribue des enregistrements. Un enregistrement est une donnée générée par un nœud du système, qui peut être un événement ou une information. Il est envoyé à la grappe, qui le stocke dans une partition thématique.
Chaque enregistrement a un décalage de séquence, et le consommateur peut contrôler le décalage qu’il consomme. Ainsi, s’il est nécessaire de retraiter le sujet, il est possible de le faire en fonction du décalage.
La logique, telle que la gestion de l’ID du dernier message lu d’un consommateur ou la décision concernant la partition sur laquelle les données nouvellement arrivées sont écrites, est entièrement transférée au client (producteur ou consommateur).
Outre les concepts de producteur et de consommateur, il existe également les concepts de sujet, de partition et de réplication.
Un sujet décrit une catégorie de messages. Kafka assure la tolérance aux pannes en répliquant les données d’un sujet et l’extensibilité en partitionnant le sujet sur plusieurs serveurs.
RabbitMQ et Kafka
Les principales différences entre Apache Kafka et RabbitMQ sont dues aux modèles de livraison de messages fondamentalement différents mis en œuvre dans ces systèmes.
En particulier, Apache Kafka fonctionne sur le principe de la traction (pull) lorsque les consommateurs obtiennent eux-mêmes les messages dont ils ont besoin à partir du sujet.
RabbitMQ, quant à lui, met en œuvre le modèle “push” en envoyant les messages nécessaires aux destinataires. En tant que tel, Kafka diffère de RabbitMQ sur les points suivants :
#1. L’architecture
L’une des plus grandes différences entre RabbitMQ et Kafka est la différence d’architecture. RabbitMQ utilise une architecture traditionnelle de file d’attente de messages basée sur un courtier, tandis que Kafka utilise une architecture de plateforme de streaming distribuée.
De plus, RabbitMQ utilise un modèle de livraison de messages basé sur la traction, tandis que Kafka utilise un modèle basé sur la poussée.
#2. Sauvegarde des messages
RabbitMQ place le message dans la file d’attente FIFO (First Input – First Output) et surveille l’état de ce message dans la file d’attente, tandis que Kafka ajoute le message au journal (écrit sur le disque), laissant au destinataire le soin d’obtenir les informations nécessaires auprès du sujet.
RabbitMQ supprime le message une fois qu’il a été remis au destinataire, tandis que Kafka conserve le message jusqu’à ce qu’il soit programmé pour nettoyer le journal.
Ainsi, Kafka enregistre l’état actuel et tous les états précédents du système et peut être utilisé comme une source fiable de données historiques, contrairement à RabbitMQ.
#3. Équilibrage de la charge
Grâce au modèle de distribution des messages par tirage, RabbitMQ réduit la latence. Cependant, il est possible que les destinataires débordent si les messages arrivent dans la file d’attente plus vite qu’ils ne peuvent les traiter.
Étant donné que dans RabbitMQ, chaque destinataire demande/télécharge un nombre différent de messages, la répartition du travail peut devenir inégale, ce qui entraînera des retards et une perte de l’ordre des messages pendant le traitement.
Pour éviter cela, chaque récepteur RabbitMQ configure une limite de préfetch, c’est-à-dire une limite sur le nombre de messages non acquittés accumulés. Dans Kafka, l’équilibrage de la charge est effectué automatiquement en redistribuant les destinataires à travers les sections (partitions) du sujet.
#4. Routage
RabbitMQ comprend quatre façons de router vers différents échanges pour la mise en file d’attente, ce qui permet un ensemble puissant et flexible de modèles de messagerie. Kafka n’implémente qu’une seule façon d’écrire des messages sur le disque sans routage.
#5. Ordonnancement des messages
RabbitMQ vous permet de maintenir un ordre relatif dans des ensembles arbitraires (groupes) d’événements, et Apache Kafka fournit un moyen facile de maintenir l’ordre avec l’évolutivité en écrivant les messages séquentiellement dans un journal répliqué (sujet).
Fonctionnalité | LapinMQ | Kafka |
Architecture | Sauvegarde des messages sur un disque attaché au courtier | Architecture d’une plateforme de diffusion en continu distribuée |
Modèle de livraison | Basé sur la traction | Basé sur la poussée |
Sauvegarde des messages | Impossible de sauvegarder les messages | Maintien des commandes en écrivant dans un sujet |
Équilibrage de la charge | Configure une limite de prélecture | Effectué automatiquement |
Routage | Comprend 4 façons d’acheminer les messages | N’a qu’une seule façon d’acheminer les messages |
Ordonnancement des messages | Permet de maintenir l’ordre dans les groupes | Permet de maintenir l’ordre en écrivant au sujet |
Processus externes | Ne nécessite pas | Nécessite l’exécution d’une instance de Zookeeper |
Plugins | Plusieurs plugins | Support limité de plugins |
RabbitMQ et Kafka sont deux systèmes de messagerie largement utilisés, chacun avec ses propres forces et cas d’utilisation. RabbitMQ est un système de messagerie flexible, fiable et évolutif qui excelle dans la mise en file d’attente des messages, ce qui en fait un choix idéal pour les applications qui nécessitent une livraison fiable et flexible des messages.
En revanche, Kafka est une plateforme de streaming distribuée conçue pour le traitement en temps réel et à haut débit de grands volumes de données, ce qui en fait un choix idéal pour les applications nécessitant un traitement et une analyse des données en temps réel.
Principaux cas d’utilisation de RabbitMQ :
Commerce électronique
RabbitMQ est utilisé dans les applications de commerce électronique pour gérer le flux de données entre différents systèmes, tels que la gestion des stocks, le traitement des commandes et le traitement des paiements. Il peut gérer des volumes importants de messages et s’assurer qu’ils sont livrés de manière fiable et dans le bon ordre.
Soins de santé
Dans le secteur de la santé, RabbitMQ est utilisé pour échanger des données entre différents systèmes, tels que les dossiers médicaux électroniques (EHR), les appareils médicaux et les systèmes d’aide à la décision clinique. Il permet d’améliorer les soins aux patients et de réduire les erreurs en garantissant que les bonnes informations sont disponibles au bon moment.
Services financiers
RabbitMQ permet la transmission de messages en temps réel entre des systèmes tels que les plateformes de négociation, les systèmes de gestion des risques et les passerelles de paiement. Il permet de s’assurer que les transactions sont traitées rapidement et en toute sécurité.
Systèmes IoT
RabbitMQ est utilisé dans les systèmes IoT pour gérer le flux de données entre différents appareils et capteurs. Il permet de s’assurer que les données sont transmises de manière sûre et efficace, même dans des environnements où la bande passante est limitée et la connectivité intermittente.
Kafka est une plateforme de streaming distribuée conçue pour traiter de grands volumes de données en temps réel.
Principaux cas d’utilisation de Kafka
Analyse en temps réel
Kafka est utilisé dans les applications d’analyse en temps réel pour traiter et analyser les données au fur et à mesure qu’elles sont générées, ce qui permet aux entreprises de prendre des décisions fondées sur des informations actualisées. Il peut traiter de gros volumes de données et s’adapter aux besoins des applications les plus exigeantes.
Agrégation de journaux
Kafka peut agréger des journaux provenant de différents systèmes et applications, ce qui permet aux entreprises de surveiller et de résoudre les problèmes en temps réel. Il peut également être utilisé pour stocker les journaux en vue d’une analyse et d’un reporting à long terme.
Apprentissage automatique
Kafka est utilisé dans les applications d’apprentissage automatique pour transmettre des données aux modèles en temps réel, ce qui permet aux entreprises de faire des prédictions et de prendre des mesures sur la base d’informations actualisées. Il peut contribuer à améliorer la précision et l’efficacité des modèles d’apprentissage automatique.
Mon avis sur RabbitMQ et Kafka
L’inconvénient des capacités étendues et variées de RabbitMQ pour la gestion flexible des files d’attente de messages est la consommation accrue de ressources et, par conséquent, la dégradation des performances en cas d’augmentation de la charge. Comme il s’agit du mode de fonctionnement des systèmes complexes, Apache Kafka est, dans la plupart des cas, le meilleur outil pour gérer les messages.
Par exemple, dans le cas de la collecte et de l’agrégation de nombreux événements provenant de dizaines de systèmes et de services, en tenant compte de leur géo-réservation, des métriques clients, des fichiers journaux et des analyses, avec la perspective d’augmenter les sources d’information, je préférerai utiliser Kafka, cependant, si vous êtes dans une situation où vous avez juste besoin d’une messagerie rapide, RabbitMQ fera très bien l’affaire !
Vous pouvez également lire comment installer Apache Kafka sous Windows et Linux.