Qu'est-ce que RabbitMQ ?
RabbitMQ est un message broker open source qui implémente le protocole AMQP (Advanced Message Queuing Protocol). Il sert d'intermédiaire entre des services qui produisent des messages et ceux qui les consomment.
Contrairement à Kafka (conçu pour le streaming de données massif et la rétention longue), RabbitMQ est optimisé pour le routage intelligent de messages et la gestion de files d'attente traditionnelles.
Les 4 composants fondamentaux
Publie le message
Route le message
Reçoit les messages des producteurs et les route vers les queues selon des règles (type d'exchange + routing key). Le producteur ne connaît jamais la queue directement.
File d'attente qui stocke les messages jusqu'à leur consommation. Peut être durable (persistée sur disque), exclusive ou auto-supprimée.
Règle qui lie un exchange à une queue, avec une routing key optionnelle. Définit quels messages arrivent dans quelle queue.
Clé utilisée par l'exchange pour router le message vers la bonne queue. Son rôle varie selon le type d'exchange.
Les types d'exchanges
Direct Exchange
Route le message vers la queue dont le binding correspond exactement à la routing key. Simple et précis.
// Message avec routing key "commande.validee" // → routé vers la queue bindée sur "commande.validee" rabbitTemplate.convertAndSend("exchange.direct", "commande.validee", message);
Topic Exchange
Route via des patterns avec wildcards. Le plus flexible : * remplace un mot, # remplace zéro ou plusieurs mots.
// Routing key : "commande.france.validee" // Correspond à : "commande.*.*" ou "commande.#" ou "#.validee" // Ne correspond pas à : "commande.validee" (un seul niveau)
Fanout Exchange
Envoie une copie du message à toutes les queues bindées, sans tenir compte de la routing key. Parfait pour la diffusion (broadcast).
Headers Exchange
Route en fonction des headers du message plutôt que de la routing key. Rarement utilisé en pratique.
Spring AMQP – Intégration Java
Configuration
@Configuration public class RabbitMQConfig { @Bean public TopicExchange commandeExchange() { return new TopicExchange("exchange.commandes"); } @Bean public Queue commandeQueue() { return QueueBuilder.durable("queue.commandes.validation").build(); } @Bean public Binding binding(Queue queue, TopicExchange exchange) { return BindingBuilder .bind(queue) .to(exchange) .with("commande.*.validee"); } }
Producteur
@Service public class CommandeEventPublisher { private final RabbitTemplate rabbitTemplate; public void publierCommandeValidee(CommandeValideeEvent event) { rabbitTemplate.convertAndSend( "exchange.commandes", "commande.france.validee", // routing key event ); } }
Consommateur
@Component public class NotificationConsumer { @RabbitListener(queues = "queue.commandes.validation") public void traiterCommandeValidee(CommandeValideeEvent event) { // Traitement du message log.info("Commande reçue : {}", event.getCommandeId()); notificationService.envoyerConfirmation(event); } }
Fiabilité & gestion des erreurs
- Acknowledgement (ACK) : le consommateur confirme la réception du message. Sans ACK, RabbitMQ remet le message en queue.
- Dead Letter Queue (DLQ) : les messages qui échouent plusieurs fois sont renvoyés dans une queue dédiée pour analyse
- Message TTL : expiration des messages après un délai configurable
- Publisher Confirms : le producteur reçoit une confirmation que RabbitMQ a bien reçu le message
- Prefetch : limite le nombre de messages non-ACKed envoyés à un consommateur, pour éviter la surcharge
RabbitMQ vs Kafka
Routage intelligent, queues traditionnelles, messages consommés et supprimés. Adapté aux workflows métier, tâches asynchrones, microservices.
Log distribué, rétention longue, replay des événements. Adapté au streaming, event sourcing, pipelines de données à très haut volume.
Dépendances Maven
<!-- Spring Boot Starter AMQP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
Outils complémentaires
Spring AMQP Spring Cloud Stream RabbitMQ Management UI Testcontainers (tests) Micrometer (monitoring)