← CodeClarityLab Home
Browse by Category
+ added · updated 7d
← Back to glossary

RabbitMQ

messaging PHP 7.0+ Intermediate
debt(d8/e5/b7/t7)
d8 Detectability Operational debt — how invisible misuse is to your safety net

Closest to 'silent in production until users hit it' (d9, scored d8). Per detection_hints.automated=no and code_pattern, missing durability/DLX/ack issues only surface on broker restart or under load; rabbitmq-management UI can reveal missing DLX or non-durable queues on inspection, slightly better than fully silent.

e5 Effort Remediation debt — work required to fix once spotted

Closest to 'touches multiple files / significant refactor in one component' (e5). quick_fix requires coordinating exchange type, queue durable=true, AND message persistence across producers and consumers — not a one-line swap, but contained within the messaging layer.

b7 Burden Structural debt — long-term weight of choosing wrong

Closest to 'strong gravitational pull' (b7). applies_to spans web/cli/queue-worker contexts; RabbitMQ as a broker shapes service boundaries, deployment topology, and failure-handling patterns across the system per why_it_matters (decoupling producers/consumers).

t7 Trap Cognitive debt — how counter-intuitive correct behaviour is

Closest to 'serious trap' (t7). The misconception is explicit: developers reasonably assume durable queue = durable messages, but both flags are required independently. This contradicts the intuitive 'durable container holds durable contents' mental model.

About DEBT scoring →

Also Known As

AMQP RabbitMQ message broker

TL;DR

A message broker implementing AMQP — producers publish to exchanges, exchanges route to queues, consumers pull from queues — providing durable, reliable message delivery.

Explanation

RabbitMQ's model: Producer → Exchange → Queue → Consumer. Exchanges route messages: direct (exact routing key), fanout (all bound queues), topic (wildcard routing keys), headers. Message durability: declare the queue as durable and messages as persistent to survive broker restarts. Acknowledgements: the consumer calls basic_ack after processing; unacked messages redeliver on consumer disconnect. Prefetch count controls how many unacked messages a consumer holds — prevents slow consumers from starving others.

Diagram

flowchart LR
    PUB[Publisher] --> EX{Exchange}
    subgraph Routing Types
        EX -->|direct: routing key match| Q1[Queue: orders]
        EX -->|fanout: all queues| Q2[Queue: logs]
        EX -->|fanout: all queues| Q3[Queue: analytics]
        EX -->|topic: pattern match| Q4[Queue: payments.uk.*]
    end
    Q1 --> C1[Consumer 1]
    Q2 --> C2[Consumer 2]
    Q3 --> C3[Consumer 3]
    Q4 --> C4[Consumer 4]
style EX fill:#6e40c9,color:#fff
style Q1 fill:#238636,color:#fff
style Q2 fill:#1f6feb,color:#fff
style Q3 fill:#1f6feb,color:#fff
style Q4 fill:#d29922,color:#fff

Common Misconception

Declaring a queue as durable makes messages survive broker restarts — both the queue AND each message must be marked durable/persistent; durable queue + transient messages still lose messages on restart.

Why It Matters

RabbitMQ decouples producers from consumers — the order service publishes 'OrderPlaced' without knowing which services consume it, enabling independent scaling and deployment.

Common Mistakes

  • Not setting prefetch_count — one slow consumer takes all messages from the queue, starving other consumers.
  • Declaring queue as durable but not marking messages as persistent — messages lost on broker restart.
  • Not handling connection failures — AMQP connections drop; implement reconnection logic.
  • No dead letter exchange — failed messages disappear silently without a DLX configured.

Code Examples

✗ Vulnerable
// Messages lost on restart — durable queue, non-persistent messages:
$channel->queue_declare('orders', false, true, false, false); // durable=true
$channel->basic_publish(
    new AMQPMessage('order data'), // No delivery_mode=2 — not persistent!
    '', 'orders'
);
// Broker restart: queue survives, messages gone
✓ Fixed
// Fully durable setup:
$channel->queue_declare('orders', false, true, false, false); // durable
$channel->basic_publish(
    new AMQPMessage('order data', [
        'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, // Persistent
    ]),
    '', 'orders'
);
$channel->basic_qos(null, 1, null); // Prefetch: 1 unacked message per consumer
$channel->basic_consume('orders', '', false, false, false, false, $callback);
// Worker acks after successful processing: $msg->ack()

Added 15 Mar 2026
Edited 5 Apr 2026
Views 37
Rate this term
No ratings yet
🤖 AI Guestbook educational data only
| |
Last 30 days
0 pings T 0 pings F 0 pings S 0 pings S 0 pings M 0 pings T 0 pings W 0 pings T 0 pings F 0 pings S 1 ping S 0 pings M 1 ping T 0 pings W 0 pings T 0 pings F 1 ping S 2 pings S 0 pings M 0 pings T 0 pings W 1 ping T 1 ping F 1 ping S 1 ping S 0 pings M 0 pings T 0 pings W 0 pings T 0 pings F
No pings yet today
No pings yesterday
Amazonbot 8 Perplexity 7 Google 7 SEMrush 3 ChatGPT 3 Unknown AI 2 Ahrefs 2 Bing 1
crawler 31 crawler_json 2
DEV INTEL Tools & Severity
🟡 Medium ⚙ Fix effort: Medium
⚡ Quick Fix
Use direct exchange for simple task queues, topic exchange for routing by pattern, and fanout exchange to broadcast to all bound queues — always set message durability and queue durable=true
📦 Applies To
PHP 7.0+ any web cli queue-worker
🔗 Prerequisites
🔍 Detection Hints
Non-durable queue losing messages on restart; no dead letter exchange; messages not acknowledged causing requeue loops
Auto-detectable: ✗ No rabbitmq-management php-amqplib laravel-queue
⚠ Related Problems
🤖 AI Agent
Confidence: Low False Positives: Medium ✗ Manual fix Fix: High Context: File Tests: Update

✓ schema.org compliant