RabbitMQ — Architecture et conventions
Vue d'ensemble
A1Connect héberge le broker RabbitMQ partagé par toutes les plateformes (Dema1n, Inspire, Inspire-v2, Jobready). La configuration canonique des queues et exchanges est définie dans rabbitmq-defs.json et chargée au premier démarrage via rabbitmq.config.
Exchanges
| Exchange | Type | Producteur |
|---|---|---|
a1connect |
direct | A1Connect |
dema1n |
direct | Dema1n |
inspire |
direct | Inspire |
jobready |
direct | Jobready |
dead_letter |
direct | RabbitMQ (interne) |
Queues
Toutes les queues métier sont de type quorum avec dead letter exchange activé :
{
"x-queue-type": "quorum",
"x-delivery-limit": 3,
"x-dead-letter-exchange": "dead_letter"
}
| Queue | Consommateur |
|---|---|
A1Connect_events |
A1Connect |
Dema1n_events |
Dema1n worker |
Dema1n_mvls |
Dema1n worker |
Inspire_events |
Inspire |
InspireV2_events |
Inspire-v2 |
InspireV2_mvls |
Inspire-v2 |
Jobready_events |
Jobready |
dead_letter_queue |
— (inspection manuelle) |
Dead Letter Exchange
Fonctionnement
Quand un message échoue (exception non catchée, Nack sans requeue), RabbitMQ le retente automatiquement jusqu'à x-delivery-limit fois (3). Au-delà, le message est redirigé vers l'exchange dead_letter, qui le route dans dead_letter_queue.
Message échoue dans Dema1n_events (3 fois)
↓
Exchange "dead_letter"
↓
Queue "dead_letter_queue" ← inspectable dans l'UI RabbitMQ (port 15672)
Pourquoi c'est important
Sans DLX, un message raté est soit perdu silencieusement, soit bloque la queue. Avec DLX, les messages problématiques sont conservés et rejouables depuis l'interface de management.
Règle critique : cohérence des arguments de queue
RabbitMQ interdit de redéclarer une queue existante avec des arguments différents — il lève une erreur PRECONDITION-FAILED et ferme le channel.
Toute déclaration de queue côté applicatif (assertQueue ou @RabbitRPC) doit passer les mêmes arguments que rabbitmq-defs.json :
// @golevelup/nestjs-rabbitmq (@RabbitRPC)
queueOptions: {
durable: true,
arguments: {
'x-queue-type': 'quorum',
'x-delivery-limit': 3,
'x-dead-letter-exchange': 'dead_letter',
},
}
// amqplib brut (assertQueue)
channel.assertQueue(queueName, {
durable: true,
arguments: {
'x-queue-type': 'quorum',
'x-delivery-limit': 3,
'x-dead-letter-exchange': 'dead_letter',
},
});
Reset du volume RabbitMQ
Si RabbitMQ refuse de démarrer (BOOT FAILED / file_ctrl_process_not_started), c'est généralement une corruption de la base Mnesia. Réinitialiser le volume :
docker-compose -p a1connect down
docker volume rm a1connect_rabbitmq
docker-compose -p a1connect up -d
Les queues et exchanges sont recréés automatiquement depuis rabbitmq-defs.json.
Ne pas supprimer le volume en production sans s'assurer que les messages en attente sont traités ou sauvegardés.
Routing keys
| Routing key | Signification |
|---|---|
user___logged |
Premier login sur une plateforme |
user___updated |
Mise à jour des données utilisateur |
user___deleted |
Suppression d'un compte |
user___mvls |
Synchronisation MVLS (binômes, suivis) |