π§ What is RabbitMQ (in simple words)?¶
RabbitMQ is a message broker.
π It sits between services and safely stores messages until another service is ready to process them.
Think of it like WhatsApp for services:
- Producer = sender
- RabbitMQ = WhatsApp server
- Consumer = receiver
π§© Why do we need RabbitMQ?¶
Without RabbitMQ:
β If Email Service is down β request fails
With RabbitMQ:
β Backend continues, email is sent later
Key Benefits¶
- Decouples services
- Handles traffic spikes
- Reliable message delivery
- Async processing
- Retry & failure handling
π RabbitMQ Core Concepts (VERY IMPORTANT)¶



1οΈβ£ Producer¶
App that sends messages
2οΈβ£ Consumer¶
App that receives messages
3οΈβ£ Queue¶
- Stores messages
- FIFO (First In, First Out)
4οΈβ£ Exchange¶
- Decides where messages go
- Producers never send directly to queues
5οΈβ£ Binding¶
- Rule that connects Exchange β Queue
π Types of Exchanges (Interview Favorite)¶
| Exchange | Use case |
|---|---|
| Direct | Exact routing |
| Fanout | Broadcast |
| Topic | Pattern-based routing |
| Headers | Header matching |
Weβll use Direct first (easiest).
π Step 1: Run RabbitMQ using Docker (Best for learning)¶
Access UI¶
π http://localhost:15672
Username: guest
Password: guest
π₯ RabbitMQ Management UI (Must Know)¶



You can:
- Create queues
- Create exchanges
- Bind queues
- Monitor messages
- See consumers
π§ͺ Step 2: Create Queue & Exchange (Manual β for understanding)¶
- Go to Exchanges
-
Create exchange:
-
Name:
order_exchange - Type:
direct - Go to Queues
-
Create queue:
-
Name:
order_queue -
Bind:
-
Exchange β Queue
- Routing key:
order.created
π§βπ» Step 3: Producer (Node.js)¶
Install dependency¶
producer.js¶
const amqp = require("amqplib");
async function sendMessage() {
const connection = await amqp.connect("amqp://localhost");
const channel = await connection.createChannel();
const exchange = "order_exchange";
const routingKey = "order.created";
const message = {
orderId: 123,
product: "Laptop",
price: 90000
};
await channel.assertExchange(exchange, "direct", { durable: true });
channel.publish(
exchange,
routingKey,
Buffer.from(JSON.stringify(message)),
{ persistent: true }
);
console.log("Order sent:", message);
setTimeout(() => {
connection.close();
process.exit(0);
}, 500);
}
sendMessage();
Run:
π Step 4: Consumer (Node.js)¶
consumer.js¶
const amqp = require("amqplib");
async function consume() {
const connection = await amqp.connect("amqp://localhost");
const channel = await connection.createChannel();
const queue = "order_queue";
await channel.assertQueue(queue, { durable: true });
channel.consume(queue, (msg) => {
if (msg) {
const data = JSON.parse(msg.content.toString());
console.log("Received order:", data);
// simulate processing
setTimeout(() => {
channel.ack(msg);
}, 1000);
}
});
}
consume();
Run:
β Youβll see messages flowing π
π Step 5: Message Acknowledgment (VERY IMPORTANT)¶
| Type | Meaning |
|---|---|
ack |
Message processed successfully |
nack |
Failed, requeue or drop |
| no ack | β Risky (message loss) |
Example:
π Step 6: Dead Letter Queue (DLQ)¶
For failed messages after retries.
Create DLX¶
Queue config¶
channel.assertQueue("order_queue", {
durable: true,
arguments: {
"x-dead-letter-exchange": "order_dlx"
}
});
π‘ Failed messages move to DLQ instead of being lost.
β‘ Step 7: Competing Consumers (Scaling)¶
Run consumer multiple times:
RabbitMQ will load balance messages automatically.
β± Step 8: Prefetch (Prevent Overload)¶
π One message at a time per consumer π Prevents memory overload
π Step 9: Retry Pattern (Production Ready)¶
Use TTL + DLX for delayed retries.
π¦ Common Real-World Use Cases¶
| Use Case | Pattern |
|---|---|
| Email sending | Async queue |
| Payment processing | Reliable delivery |
| Log processing | Fanout |
| Notifications | Topic |
| Microservices | Event-driven |
π§ RabbitMQ vs Kafka (Quick Clarity)¶
| RabbitMQ | Kafka |
|---|---|
| Task queue | Event streaming |
| Low latency | High throughput |
| Easier | More complex |
| Per-message ack | Offset-based |
π Use RabbitMQ for backend jobs π Kafka for analytics / streams
π Production Best Practices¶
β
Use durable queues
β
Use persistent messages
β
Enable ack
β
Use DLQ
β
Monitor via UI / Prometheus
β
Donβt use guest in prod
β
Separate vhosts per app
π§ͺ Bonus: Docker Compose (Recommended)¶
π§ What You Should Learn Next¶
- Topic exchange
- Retry queues
- Delayed messages
- Priority queues
- Security (users, vhosts)
- RabbitMQ + Kubernetes
- RabbitMQ + OpenTelemetry