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.

RabbitMQ-1

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 :

routing-1
Image Source : rabbitmq
  • 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.

Apache-Kafka-1

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.

wd
Source de l’image : Wikipédia

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éLapinMQKafka
ArchitectureSauvegarde des messages sur un disque attaché au courtierArchitecture d’une plateforme de diffusion en continu distribuée
Modèle de livraisonBasé sur la tractionBasé sur la poussée
Sauvegarde des messagesImpossible de sauvegarder les messagesMaintien des commandes en écrivant dans un sujet
Équilibrage de la chargeConfigure une limite de prélectureEffectué automatiquement
RoutageComprend 4 façons d’acheminer les messagesN’a qu’une seule façon d’acheminer les messages
Ordonnancement des messagesPermet de maintenir l’ordre dans les groupesPermet de maintenir l’ordre en écrivant au sujet
Processus externesNe nécessite pas Nécessite l’exécution d’une instance de Zookeeper
PluginsPlusieurs pluginsSupport 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

ecommerce

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

Real-time-analytics

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.