Hasina Razafintsalama

Hasina RAZAFINTSALAMA

← Retour au Blog
Architecture

RabbitMQ vs Kafka vs Redis : choisir une file de messages

On les met dans le même panier alors que ce sont des outils différents : une file de tâches, un log d'événements, et un intermédiaire léger. Voici à quoi sert chacun, ce qu'il coûte à opérer, et comment choisir.

2026-09-03·11 min

RabbitMQ, Kafka et Redis déplacent tous des messages entre les parties d'un système, ce qui explique qu'ils atterrissent dans la même conversation. Ils reposent sur des modèles différents : RabbitMQ est une file de tâches avec un routage riche, Kafka est un log d'événements persistant que vous pouvez rejouer, et Redis est un stockage en mémoire qui peut faire de la mise en file légère. Bien choisir, c'est faire correspondre le modèle à ce dont vous avez réellement besoin.

RabbitMQ vs Kafka vs Redis en un coup d'oeil

AspectRabbitMQKafkaRedis (Streams / listes)
ModèleFile de tâches, message brokerLog distribué en append-onlyStockage en mémoire, files simples
LivraisonAt-least-once, acks par messageAt-least-once, le consommateur suit son offsetAt-least-once avec Streams, at-most-once avec les listes
OrdrePar fileStrict par partitionPar stream
Rétention / rejeuConsommé puis disparuGardé sur une fenêtre, entièrement rejouableLimitée, bornée par la mémoire
DébitÉlevéTrès élevéTrès élevé, borné par la mémoire
Complexité opsModéréeÉlevée (brokers, ZooKeeper/KRaft, partitions)Faible, souvent déjà dans votre stack
Usage typiqueJobs de fond, RPC, distribution de travailEvent streaming, event sourcing, pipelines analyticsFiles de jobs, pub/sub simple, rate limiting

RabbitMQ : un vrai message broker

RabbitMQ brille quand vous avez besoin de routage : les exchanges et les bindings permettent de diffuser un message vers plusieurs files, de router par clé, ou de filtrer par headers, et les consommateurs acquittent chaque message pour que la redélivraison soit précise. C'est le bon choix pour distribuer du travail de fond entre des pools de workers, pour les patterns requête-réponse, et pour tout flux où la logique de routage n'est pas triviale.

Kafka : un log que vous pouvez rejouer

Kafka n'est pas une file ; c'est un log ordonné et persistant que plusieurs consommateurs lisent indépendamment, chacun suivant sa propre position. Comme les messages restent sur une fenêtre de rétention, un nouveau consommateur peut rejouer l'historique, et vous pouvez reconstruire un stockage en aval à partir du log. Ça en fait l'outil de l'event streaming, de l'event sourcing, et pour alimenter plusieurs pipelines analytics ou de recherche depuis une seule source de vérité. Le coût est opérationnel : partitions, réplication, rééquilibrage des consumer groups, et un cluster à faire tourner.

Redis : l'intermédiaire léger

Redis est probablement déjà dans votre stack pour le cache, et Redis Streams ou de simples listes gèrent bien une file de jobs pour beaucoup d'applications. Le driver de queue de Laravel sur Redis, avec Horizon pour la visibilité, est un montage courant et solide. Les limites sont réelles : tout vit en mémoire, la rétention est bornée, et les fonctionnalités de routage et de rejeu des deux autres ne sont pas là. Utilisez-le jusqu'à avoir une raison concrète de ne pas le faire.

Publier de façon fiable : le pattern outbox

Quel que soit le broker choisi, publier un événement dans le même souffle qu'une écriture en base n'est pas atomique : l'écriture peut committer et la publication échouer, ou l'inverse. Écrivez l'événement dans une table outbox à l'intérieur de la même transaction que le changement métier, puis un processus séparé lit l'outbox et publie vers le broker. C'est ainsi qu'on obtient une publication exactement-une sans transactions distribuées.

Avec Laravel

Pour les jobs de fond, la queue intégrée sur Redis plus Horizon couvre l'essentiel des besoins avec presque aucune mise en place. Pour RabbitMQ, un driver de queue communautaire connecte les mêmes classes Job à un backend RabbitMQ. Pour Kafka, des packages existent mais vous intégrez généralement Kafka pour de l'event streaming entre services plutôt que comme file de jobs Laravel, donc vous le produisez et le consommez directement.

Un guide de décision

  • Jobs de fond, une poignée de services, pas de besoin de rejeu : queue Redis plus Horizon.
  • Routage complexe, distribution de travail entre pools de workers, requête-réponse : RabbitMQ.
  • Event streaming, event sourcing, rejeu, plusieurs consommateurs sur une source : Kafka, et prévoyez le budget opérationnel.
  • Pas sûr et sur Laravel : commencez par Redis. Passer à RabbitMQ plus tard est un changement de driver ; passer à Kafka est un changement d'architecture que vous faites délibérément.

FAQ

RabbitMQ ou Kafka ?
RabbitMQ si vous avez besoin d'un routage riche et d'un acquittement précis par message pour distribuer du travail de fond. Kafka si vous avez besoin d'un log ordonné et rejouable que plusieurs consommateurs lisent indépendamment, pour de l'event streaming ou de l'event sourcing. Ils ne sont pas interchangeables : l'un est un broker, l'autre est un log.
Redis suffit-il comme file de messages ?
Pour des jobs de fond dans une application avec une poignée de services et sans besoin de rejouer l'historique, oui. Redis Streams et la queue Redis de Laravel avec Horizon sont un montage courant et fiable. Vous le dépassez quand vous avez besoin de routage, de rejeu durable, ou d'un débit au-delà de ce que la mémoire permet.
Kafka est-il surdimensionné pour mon projet ?
Souvent, oui. Kafka gagne son coût opérationnel quand vous avez de l'event streaming entre de nombreux services, besoin de rejouer des événements pour reconstruire un état, ou d'alimenter plusieurs pipelines analytics et de recherche depuis un log. Pour des jobs de fond dans une seule application, c'est plus de machinerie que le problème n'en demande.
Quelle différence entre une file de tâches et un log d'événements ?
Une file de tâches livre chaque message à un consommateur, qui le traite et l'acquitte, après quoi il disparaît. Un log d'événements garde les messages sur une fenêtre de rétention et laisse plusieurs consommateurs les lire indépendamment à leur rythme, et les rejouer. RabbitMQ est le premier ; Kafka est le second.
Comment garantir qu'un message n'est pas perdu ?
Utilisez une livraison at-least-once avec acquittement des consommateurs, rendez les consommateurs idempotents pour qu'un message redélivré soit sans risque, et publiez les événements avec le pattern outbox pour que la publication ne puisse pas échouer silencieusement après le commit de l'écriture en base. Puis surveillez le retard des consommateurs et les dead-letter queues.

RabbitMQ, Kafka et Redis résolvent trois problèmes liés mais distincts : distribuer du travail, streamer des événements rejouables, et faire de la mise en file légère. Sur Laravel, commencez par la queue Redis, passez à RabbitMQ quand le routage devient réel, et adoptez Kafka seulement quand l'event streaming fait vraiment partie de votre architecture.

Besoin d'aide sur ce sujet ? Migration Microservices

Découvrir ce service