Aller au contenu principal

RabbitMQ

RabbitMQ est un broker de messages permettant la communication asynchrone entre différentes applications.
Il fonctionne via des exchanges et des queues, ce qui permet de publier, router et consommer des messages efficacement.

remarque

Durant ce projet, la gestion interne de RabbitMQ est faite pas les équipes Socle et DevOps

Créer une queue

Toute nouvelle queue ou changement de permission / nom doit être validé par les urbanistes et effectué par l'équipe DevOps.

Utiliser RabbitMQ localement

Une instance RabbitMQ est incluse dans le Docker Compose du projet.
Elle est accessible via :

  • Interface web : http://localhost:15672
    Identifiants par défaut : guest / guest
  • Broker : amqp://localhost:5672
attention

Comme toutes autres variables d'environnement, vous ne devez rien hardcoder dans le code. Celles ci sont déja configurer pour vous dans le fichier .env.

Fonctionnement

Pour comprendre le fonctionnement de RabbitMQ, voici un schéma simplifié :

L'application A publie un message dans un exchange, celui-ci le route vers la queue appropriée, où l'application B ou C peut le consommer à son rythme.

Utilisation du RabbitMQService

Publication de messages

publish(queueName: string, data: any): boolean

  • Publie data (sérialisé en JSON) sur la queue queueName via l'exchange par défaut ('').

Exemples :

// Publier un message
this.rabbitMQService.publish('template-app.food', {
action: 'created',
foodId: 123,
});

Consommation de messages

consume(queueName: string, callback: (message: any) => Promise<void>, requeueOnError = false): Promise<void>

  • Démarre l'écoute continue d'une queue et appelle callback pour chaque message.
  • callback doit être une fonction async qui prend l'objet JSON (ou { rawMessage: string } si le message n'est pas du JSON valide).
  • requeueOnError contrôle si un message NACKé est renvoyé dans la queue (true) ou rejeté définitivement (false).

Exemples :

// Dans onModuleInit d'un consumer
await this.rabbitMQService.consume('template-app.food', async (message) => {
// traiter le message
if (message.action === 'created') {
// logique création
}
});

Acknowledgement (Ack)

Par défaut, si le callback se termine sans erreur, le message est acknowledgé (confirmé) et retiré de la queue. Si une exception est levée, le message est nacknowledgé (non confirmé). Si requeueOnError est true, le message est remis dans la queue pour être réessayé plus tard ; sinon, il est rejeté définitivement.

Management des permissions

La configuration des queues et des permissions sont faites par l'équipe DevOps, pour créer des queues ou modifier quel application peuvent y accéder, il faut faire une demande via ticket.

attention

Ne jamais créer une queue directement dans le code

attention

L'accès lecture/écriture a une queue dont vous n'avez pas la permission provoquera une erreur.

Tableau des queues initiales

QueueAchatE-commerceFideliteGestionLogistiquePaiementPromotionsReferentielsSAV
achat.demande-reassortOW
achat.accuse-receptionOWW
e-commerce.erreur-confirmationOW
e-commerce.suivi-livraisonOW
e-commerce.personalized-createdOW
fidelite.historique-achatWOW
fidelite.campagne-promoOW
gestion.click-and-collectWO
gestion.validation-promoOW
gestion.bon-commandeWO
gestion.paiement-tpeOW
logistique.bon-commandeWO
logistique.ordre-preparationWO
sav.suivi-reparationWO
sav.event-reparationWO
paiement.expedition-commandeWO
promotion.client-connectedWO

O : Owner (lecture + écriture) W : Writer (écriture seule)

Dernière mise à jour : 2025-11-14

Bonnes pratiques

  • Appeler consume une seule fois par queue (généralement depuis onModuleInit).
  • Toujours envoyer du JSON valide depuis la Management UI si vous testez manuellement (ex: {"test": "hello"}).
  • Préférez des payloads JSON avec un champ action pour router la logique côté consumer.
  • Utiliser requeueOnError = false si vous préférez envoyer les messages échoués vers une dead-letter queue plutôt que les réessayer indéfiniment.

Exemple minimal de test via l'UI

Dans l'interface Management → Queues → Publish message, mettre dans "Payload":

{"test": "message sent from UI"}

Docs externes