Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🐇 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.

1.1

Vue d'ensemble

AMQP, concepts clés, vocabulaire.

AMQP 0‑9‑1 Broker Producer/Consumer
1.2

Architecture

Exchanges, queues, bindings, routing keys.

direct topic fanout
1.3

Installation

Linux, Docker, cluster minimal, plugins.

apt/yum docker plugins
2.1

Queues & Durabilité

Durable, persistent, quorum vs classic.

durable persistent quorum
2.2

Routage

Bindings, wildcards, dead‑letter.

routing key DLX headers
2.3

Acks, QoS & Prefetch

ack/nack, no‑ack, prefetch global.

basic.ack QoS flow
3.1

Patrons & Scénarios

Work queues, pub/sub, RPC, retry.

pubsub RPC retry
3.2

HA, Clustering

Quorum queues, mirroring, policies.

quorum raft policy
3.3

Federation & Shovel

Ponts inter‑sites, DR, migrations.

federation shovel
4.1

Management

UI, CLI, policies, utilisateurs.

rabbitmqctl mgmt UI
4.2

Monitoring

Prometheus, métriques, alertes.

prometheus grafana
4.3

Sécurité

TLS, vhosts, permissions, authN.

TLS LDAP/OIDC
5.1

Clients & SDK

Python, Node, Java, .NET.

pika amqplib spring‑amqp
5.2

Performance & Tuning

Disque, CPU, connexions, flots.

HiPerf I/O
5.3

Troubleshooting

Alarms, flow control, partitions.

alarms partitions
6.1

Cas d'usage

Web, IoT, ETL, micro‑services.

async buffer
8.1

Références

Sites officiels, docs, guides.

doc best practices
8.2

Cheat‑sheet

Commandes, headers, propriétés.

quick sheet
1.1 Vue d'ensemble – Qu'est‑ce que RabbitMQ ?
Messagerie 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ĂšreRabbitMQKafkaRedis Streams
ModùleQueue, ack par msgLog append‑only, offsetStream in‑memory/disk
RoutageExchange (direct/topic/...)Topic/partitionGroupes
SemantiqueAt‑least‑once (par dĂ©faut)At‑least‑onceAt‑least‑once
Cas fortsRPC, work queues, IoTAnalytics, ETL massifsJobs légers, microservices
Diagramme conceptuel
+-----------+      bind (error.#)       +--------+
| producer |  -->  [topic exchange]  -->| queueA |--> consumer A
+-----------+      bind (#.payment)      +--------+
                                         +--------+
                                         | queueB |--> consumer B
                                         +--------+
          
1.2 Architecture – Exchanges & Routage
TypeRĂšgle de routageUsageExemple
directclé exacteRPC, commandeskey=invoice.create
topicwildcards * (un mot) / # (0‑n mots)Routes flexibleslog.*.error, order.#.paid
fanoutdiffusion Ă  tousbroadcastnotifications globales
headersmatch sur headerslegacy/intĂ©grationx‑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)
        
1.3 Installation & Démarrage
# 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+).
2.1 Queues : Classic vs Quorum, Durabilité & TTL
CritĂšreClassicQuorum (Raft)
HAMirroring (legacy), risque split‑brainRĂ©plicas Raft, consensus
OrdreGlobal par queueLocal par leader (re‑delivery possible)
UsageMononƓud, dev/test, flux non critiquesProduction HA, fiabilitĂ© prioritaire
ConseilÉviter mirroring largePar 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' }
        
2.2 Routage (topic/direct/headers) & Dead‑Letter
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)
          
2.3 Acknowledgements, QoS & Fair‑dispatch
# 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
        
3.1 Patterns (Work queues, Pub/Sub, RPC, Retry)
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.2 Haute Dispo & Clustering
  • 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).
3.3 Federation & Shovel – Interconnexion
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
          
4.1 Management : UI, CLI & Policies
# 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
        
4.2 Monitoring & Graphiques (Prometheus/Grafana)
Métriques indispensables
MétriqueSignificationSeuils conseillés
rabbitmq_queue_messages_readyMessages en attente< 5k/queue (appli)
rabbitmq_queue_messages_unackedNon ackés (consumers lents)<= prefetch * consumers
rabbitmq_disk_space_availableEspace disque libre> 20 %
connections / channelsRessources ErlangSurveiller 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).

4.3 Sécurité : TLS, Vhosts, Permissions & Auth
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.
5.1 Clients – Snippets Python/Node/Java
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
        
5.2 Performance & Tuning
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
          
5.3 Troubleshooting – Alarms, Flow control, Partitions
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).
        
6.1 Cas d'usage & Applications
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.
8.1 Références officielles & liens utiles
  • 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.

8.2 Cheat‑sheet – Commandes & propriĂ©tĂ©s
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_mode2 = persistent
priority0..9 (x-max-priority)
expirationTTL individuel (ms)
headersRoutage headers/metadata
correlation_idRPC corrélation
reply_toRPC queue