Skip to content

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)