đ RabbitMQ â Architecture, OpĂ©rations & Bonnes Pratiques
Guide complet IDEOâLab pour concevoir, exploiter et dĂ©panner une plateforme de messagerie AMQP 0â9â1 / Stream.
Vue d'ensemble
AMQP, concepts clés, vocabulaire.
AMQP 0â9â1 Broker Producer/ConsumerArchitecture
Exchanges, queues, bindings, routing keys.
direct topic fanoutInstallation
Linux, Docker, cluster minimal, plugins.
apt/yum docker pluginsQueues & Durabilité
Durable, persistent, quorum vs classic.
durable persistent quorumRoutage
Bindings, wildcards, deadâletter.
routing key DLX headersAcks, QoS & Prefetch
ack/nack, noâack, prefetch global.
basic.ack QoS flowPatrons & Scénarios
Work queues, pub/sub, RPC, retry.
pubsub RPC retryHA, Clustering
Quorum queues, mirroring, policies.
quorum raft policyFederation & Shovel
Ponts interâsites, DR, migrations.
federation shovelManagement
UI, CLI, policies, utilisateurs.
rabbitmqctl mgmt UIMonitoring
Prometheus, métriques, alertes.
prometheus grafanaSécurité
TLS, vhosts, permissions, authN.
TLS LDAP/OIDCClients & SDK
Python, Node, Java, .NET.
pika amqplib springâamqpPerformance & Tuning
Disque, CPU, connexions, flots.
HiPerf I/OTroubleshooting
Alarms, flow control, partitions.
alarms partitionsCas d'usage
Web, IoT, ETL, microâservices.
async bufferRéférences
Sites officiels, docs, guides.
doc best practicesCheatâsheet
Commandes, headers, propriétés.
quick sheetMessagerie orientĂ©e files (AMQP 0â9â1)
- Broker : serveur RabbitMQ recevant des messages de producers et les livrant Ă des consumers.
- Exchange : point d'entrée ; route les messages vers une ou plusieurs queues via des bindings.
- Queue : tampon persistant/volatile oĂč les consommateurs lisent les messages.
- Routingâkey : clĂ© textuelle utilisĂ©e par les exchanges direct/topic.
- Ack : confirmation de traitement ; prefetch contrÎle l'équité.
Flux d'un message
[Producer] --publish--> [Exchange] --(bindings,routing)--> [Queue] --deliver--> [Consumer]
(direct/topic/fanout/headers)
Pourquoi RabbitMQ ?
- Découplage applicatif, robustesse face aux pics, retries contrÎlés.
- Interop (clients nombreux), management UI, plugins (federation, shovel, prometheus).
- Deux modĂšles : Classic queues (simple) et Quorum queues (HA via Raft).
Comparatif rapide
| CritĂšre | RabbitMQ | Kafka | Redis Streams |
|---|---|---|---|
| ModĂšle | Queue, ack par msg | Log appendâonly, offset | Stream inâmemory/disk |
| Routage | Exchange (direct/topic/...) | Topic/partition | Groupes |
| Semantique | Atâleastâonce (par dĂ©faut) | Atâleastâonce | Atâleastâonce |
| Cas forts | RPC, work queues, IoT | Analytics, ETL massifs | Jobs légers, microservices |
Diagramme conceptuel
+-----------+ bind (error.#) +--------+
| producer | --> [topic exchange] -->| queueA |--> consumer A
+-----------+ bind (#.payment) +--------+
+--------+
| queueB |--> consumer B
+--------+
| Type | RĂšgle de routage | Usage | Exemple |
|---|---|---|---|
| direct | clé exacte | RPC, commandes | key=invoice.create |
| topic | wildcards * (un mot) / # (0ân mots) | Routes flexibles | log.*.error, order.#.paid |
| fanout | diffusion Ă tous | broadcast | notifications globales |
| headers | match sur headers | legacy/intĂ©gration | xâmatch any/all |
PUT exchange: 'events', type: 'topic'
BIND queue 'billing.q' with 'order.*.paid'
BIND queue 'alerts.q' with '*.critical.#'
Bindings & clés
- Plusieurs bindings d'une queue = duplication contrĂŽlĂ©e (mĂȘmes msg dans plusieurs queues).
- Headers passent par les propriétés du message (table AMQP), utiles pour routage hors clé.
- Alternateâexchange pour capter les messages non routĂ©s (deadâletter fonctionnelle).
arguments = { 'alternate-exchange': 'ae.unrouted' }
Topologies fréquentes
[Work queues]
producer -> exchange(direct) -> queueA, queueB (roundârobin par channel, via acks/prefetch)
[Pub/Sub]
producer -> exchange(fanout) -> queue_mail, queue_sms, queue_push
[Topic routing]
producer -> exchange(topic 'events.*') -> queue_app1(events.#), queue_ops(#.error)
# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y rabbitmq-server
sudo systemctl enable --now rabbitmq-server
# Activer UI Management
sudo rabbitmq-plugins enable rabbitmq_management
# http://localhost:15672 (guest/guest en local)
# RHEL/CentOS
sudo yum install -y rabbitmq-server
sudo systemctl enable --now rabbitmq-server
dockerâcompose.yml
version: '3.8'
services:
rabbit:
image: rabbitmq:3.13-management
ports: ["5672:5672", "15672:15672"]
environment:
RABBITMQ_DEFAULT_USER: ideolab
RABBITMQ_DEFAULT_PASS: change_me
volumes:
- rabbit-data:/var/lib/rabbitmq
volumes:
rabbit-data:
Cluster 3 nĆuds (hostname r1,r2,r3)
# Sur chaque nĆud
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
# Sur r2 et r3 joindre r1
sudo rabbitmqctl join_cluster rabbit@r1
sudo rabbitmqctl start_app
# Politique HA pour Quorum par défaut
rabbitmqctl set_policy ha-q "^q\." '{"queue-type":"quorum"}' --apply-to queues
- rabbitmq_management : UI + API HTTP.
- rabbitmq_prometheus : export des métriques.
- rabbitmq_federation / _management : liaisons interâsites.
- rabbitmq_shovel : copie/relai de messages entre brokers.
- rabbitmq_stream : modĂšle streaming (3.13+).
| CritĂšre | Classic | Quorum (Raft) |
|---|---|---|
| HA | Mirroring (legacy), risque splitâbrain | RĂ©plicas Raft, consensus |
| Ordre | Global par queue | Local par leader (reâdelivery possible) |
| Usage | MononĆud, dev/test, flux non critiques | Production HA, fiabilitĂ© prioritaire |
| Conseil | Ăviter mirroring large | Par dĂ©faut en 3.x pour HA |
# Créer une quorum queue via policy
type=quorum -> rabbitmqctl set_policy q-ha ".*" '{"queue-type":"quorum"}' --apply-to queues
- Durable queue : survit au redémarrage du broker.
- Persistent message :
delivery_mode=2(sauvĂ© sur disque). - La persistance n'est pas un flush instantanĂ© : nĂ©cessite publisherâconfirm cĂŽtĂ© producteur.
# Python (pika)
props = pika.BasicProperties(delivery_mode=2) # persistent
channel.basic_publish(exchange='events', routing_key='user.created', body=payload, properties=props)
Politique de rétention
# TTL par message et DLX
args = {
'x-message-ttl': 300000, # 5 min
'x-dead-letter-exchange': 'dlx',
'x-dead-letter-routing-key': 'retry'
}
channel.queue_declare('orders.q', durable=True, arguments=args)
# Limite de longueur
{'x-max-length': 100000, 'x-overflow': 'reject-publish' }
Wildcards du topic
#.error -> n'importe quel suffixe error
app.*.* -> deux mots aprĂšs app
region.eu.# -> tout ce qui commence par region.eu.
Headers exchange
x-match=all: {env: 'prod', team: 'data'}
x-match=any: {priority: 'high', alert: true}
DeadâLetter Exchange (DLX)
- Alimente des files retry/parking.
- DLX déclenché par reject/nack, TTL expiré, ou longueur dépassée.
# Déclaration
exchange dlx(topic); queue retry (x-message-ttl=30000 -> renvoi)
queue parking (analyse manuelle)
# Python (pika)
method, props, body = channel.basic_get('orders.q')
try:
process(body)
channel.basic_ack(method.delivery_tag)
except TemporaryError:
channel.basic_nack(method.delivery_tag, requeue=True)
except FatalError:
channel.basic_reject(method.delivery_tag, requeue=False) # DLX
- prefetch=1 : distribution équitable (évite qu'un consumer lent sature).
- prefetch global vs parâchannel : parâconsumer recommandĂ©.
channel.basic_qos(prefetch_count=8) # batch 8 messages/conso
CÎté producteur, garantit la persistance cÎté broker.
channel.confirm_delivery()
channel.basic_publish(...)
# lĂšve une exception si le broker n'a pas ack le publish
producer -> exchange(direct) -> queue(work) consumers x N with prefetch=1, ack explicite
# Node.js (amqplib)
const q = 'work.q';
ch.assertQueue(q, {durable:true});
ch.prefetch(1);
ch.consume(q, async msg => { await doJob(msg); ch.ack(msg); });
exchange fanout 'broadcast' -> queue_mail, queue_sms, queue_push
RPC = reply_to + correlation_id
client publishes (reply_to=temp-queue)
server replies to reply_to with same correlation_id
# Retry avec délais exponentiels (x-dead-letter-exchange) try_queue -> DLX-> retry_5s -> DLX-> retry_30s -> DLX-> parking
- 3 nĆuds min recommandĂ©s.
- Leader + followers, rébalance automatique.
- Idéal pour workloads critiques.
# Exemple (non recommandé large prod)
rabbitmqctl set_policy mirror-all ".*" '{"ha-mode":"all"}' --apply-to queues
- Activer peer discovery (K8s/Consul) pour l'autoâcluster.
- Surveiller latence interânĆuds (< 10ms conseillĂ©).
- En cas de partition, configurer la politique de résolution (pause_minority, autoheal).
Federation
Propager des messages d'un exchange distant vers un exchange local (pull, tolérant aux coupures).
# via UI/Policy
upstream name=dc2 uri=amqp://user:pass@dc2
policy: federate-ex '^events\.' on exchanges
Shovel
Relier une source Ă une destination (queue/exchange â queue/exchange), approche push.
shovel: from amqp://dc1/exchange events.* -> to amqp://dc2/exchange backup.events
# API HTTP (auth basique)
curl -u user:pass http://host:15672/api/overview
curl -u user:pass http://host:15672/api/queues/%2F/orders.q
rabbitmqctl list_queues name messages consumers state
rabbitmq-diagnostics observer # vue Erlang
rabbitmq-diagnostics check_port_connectivity
# Appliquer un TTL par défaut sur *.retry
rabbitmqctl set_policy retry-ttl "^.*\.retry$" '{"message-ttl":30000}' --apply-to queues
Métriques indispensables
| Métrique | Signification | Seuils conseillés |
|---|---|---|
| rabbitmq_queue_messages_ready | Messages en attente | < 5k/queue (appli) |
| rabbitmq_queue_messages_unacked | Non ackés (consumers lents) | <= prefetch * consumers |
| rabbitmq_disk_space_available | Espace disque libre | > 20 % |
| connections / channels | Ressources Erlang | Surveiller croissance |
Graphiques (exemples ASCII)
Msgs Ready (5 min)
|âââââââââââââ
â
ââââ| 12k -> 1k (drain)
Throughput msg/s
pub |âââââââââââ
|
del |âââââââââââ|
Exporter avec plugin rabbitmq_prometheus, importer un dashboard Grafana (templates publics).
listeners.tcp = none
listeners.ssl.default = 5671
ssl_options.cacertfile = /etc/rabbitmq/ca.pem
ssl_options.certfile = /etc/rabbitmq/cert.pem
ssl_options.keyfile = /etc/rabbitmq/key.pem
rabbitmqctl add_vhost prod
rabbitmqctl add_user api secret
rabbitmqctl set_permissions -p prod api "^events.*" ".*" ".*"
- LDAP, OAuth2/OIDC via plugin, authN externe.
- Rotation des credentials applicatifs, interdiction de guest Ă distance.
import pika
params = pika.URLParameters('amqp://ideolab:pass@host/%2F')
conn = pika.BlockingConnection(params)
ch = conn.channel()
ch.exchange_declare('events', 'topic', durable=True)
ch.basic_publish('events','user.created', b'{...}',
pika.BasicProperties(delivery_mode=2))
const amqp = require('amqplib');
const conn = await amqp.connect('amqp://ideolab:pass@host');
const ch = await conn.createChannel();
await ch.assertExchange('events','topic',{durable:true});
await ch.publish('events','order.paid',Buffer.from(JSON.stringify(obj)),{persistent:true});
// Spring Boot application.yml
spring:
rabbitmq:
host: host
username: ideolab
password: pass
Recommandations systĂšme
- Stockage SSD (latence < 1 ms), journal sur disque rapide.
- RAM suffisante (â„ 8â16 Go) pour connexions et index.
- Limiter connexions (pooling) ; préférer canaux multiples par connexion.
# rabbitmq.conf
vm_memory_high_watermark.relative = 0.4
consumer_timeout = 300000
Throughput
Publisher confirms batchĂ©s (100â500)
Prefetch 50â300 pour consommateurs CPUâbound
DĂ©sactiver l'autoâdelete et l'autoâexpire en production
rabbitmq-diagnostics alarm_status
# Ajuster le watermark mémoire/disque si besoin
Se produit quand producteurs saturent les queues ou I/O disque â ralentissement volontaire.
rabbitmqctl list_connections name state send_pend
# Politique de résolution
distribution.application:set_env(rabbit, net_ticktime, 60).
Microâservices & Web
- Asynchroniser emails, SMS, webhooks.
- Orchestration de jobs (facturation, PDF, resize d'images).
- Antiâpic (bufferisation) face Ă des API tierces.
IoT & Edge
- Collecte télémétrie (topic par device).
- Shovel vers datacenter.
Data/ETL
- DĂ©clenchement pipelines, prioritĂ©s (xâmaxâpriority).
- DLQ pour rejets analytiques.
Banque & Paiement
- RPC synchrone (timeout) pour scoring/3DS.
- Site officiel : rabbitmq.com (Docs, Tutorials, Best Practices).
- Monitoring : plugin Prometheus + dashboards Grafana officiels.
- Tutoriels : guides par langage (Python, Java, .NET, JS).
- Plugins : management, federation, shovel, stream, prometheus.
- Outils : PerfTest, Prometheus exporter, rabbitmqadmin.
IntĂ©grez ces liens dans votre KnowledgeâHub IDEOâLab pour RAG interne.
CLI
rabbitmqctl add_user user pass
rabbitmqctl set_user_tags user administrator
rabbitmqctl add_vhost dev
rabbitmqctl set_permissions -p dev user ".*" ".*" ".*"
rabbitmqadmin list queues name messages consumers
Propriétés de message
| Clé | Usage |
|---|---|
| delivery_mode | 2 = persistent |
| priority | 0..9 (x-max-priority) |
| expiration | TTL individuel (ms) |
| headers | Routage headers/metadata |
| correlation_id | RPC corrélation |
| reply_to | RPC queue |
