Retour au portfolio Culture technique
Message Broker · Event-Driven

RabbitMQ

Broker de messages open source basé sur le protocole AMQP. Permet l'échange asynchrone de messages entre services via des exchanges, queues et bindings.

AMQP Exchanges Queues Spring AMQP Asynchrone
Voir le concept Event-Driven Architecture

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

Flux d'un message dans RabbitMQ
📤 Producer
Publie le message
🔀 Exchange
Route le message
routing key
📥 Queue A
📥 Queue B
⚙️ Consumer 1
⚙️ Consumer 2
Exchange

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.

Queue

File d'attente qui stocke les messages jusqu'à leur consommation. Peut être durable (persistée sur disque), exclusive ou auto-supprimée.

Binding

Règle qui lie un exchange à une queue, avec une routing key optionnelle. Définit quels messages arrivent dans quelle queue.

Routing Key

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

Dead Letter Queue : toujours configurer une DLQ en production. Sans elle, un message qui échoue en boucle peut bloquer la queue entière ou être simplement perdu.

RabbitMQ vs Kafka

RabbitMQ

Routage intelligent, queues traditionnelles, messages consommés et supprimés. Adapté aux workflows métier, tâches asynchrones, microservices.

Kafka

Log distribué, rétention longue, replay des événements. Adapté au streaming, event sourcing, pipelines de données à très haut volume.

En pratique : RabbitMQ est le choix naturel pour la communication inter-services dans une architecture microservices standard. Kafka s'impose quand on a besoin de rejouer des événements ou de traiter des millions de messages par seconde.

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)