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.
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
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 queuequeueNamevia 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
callbackpour chaque message. callbackdoit être une fonctionasyncqui prend l'objet JSON (ou{ rawMessage: string }si le message n'est pas du JSON valide).requeueOnErrorcontrô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.
Ne jamais créer une queue directement dans le code
L'accès lecture/écriture a une queue dont vous n'avez pas la permission provoquera une erreur.
Tableau des queues initiales
| Queue | Achat | E-commerce | Fidelite | Gestion | Logistique | Paiement | Promotions | Referentiels | SAV |
|---|---|---|---|---|---|---|---|---|---|
| achat.demande-reassort | O | W | |||||||
| achat.accuse-reception | O | W | W | ||||||
| e-commerce.erreur-confirmation | O | W | |||||||
| e-commerce.suivi-livraison | O | W | |||||||
| e-commerce.personalized-created | O | W | |||||||
| fidelite.historique-achat | W | O | W | ||||||
| fidelite.campagne-promo | O | W | |||||||
| gestion.click-and-collect | W | O | |||||||
| gestion.validation-promo | O | W | |||||||
| gestion.bon-commande | W | O | |||||||
| gestion.paiement-tpe | O | W | |||||||
| logistique.bon-commande | W | O | |||||||
| logistique.ordre-preparation | W | O | |||||||
| sav.suivi-reparation | W | O | |||||||
| sav.event-reparation | W | O | |||||||
| paiement.expedition-commande | W | O | |||||||
| promotion.client-connected | W | O |
O : Owner (lecture + écriture) W : Writer (écriture seule)
Dernière mise à jour : 2025-11-14
Bonnes pratiques
- Appeler
consumeune seule fois par queue (généralement depuisonModuleInit). - 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
actionpour router la logique côté consumer. - Utiliser
requeueOnError = falsesi 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"}