← Về danh sách bài họcBài 6/20

🐰 Bài 6: RabbitMQ - Giới Thiệu & Cài Đặt

⏱️ Thời gian đọc: 20 phút | 📚 Độ khó: Cơ bản

🎯 Sau bài học này, bạn sẽ:

1. RabbitMQ Là Gì?

RabbitMQ là một open-source message broker triển khai giao thức AMQP (Advanced Message Queuing Protocol). Được viết bằng Erlang/OTP — ngôn ngữ nổi tiếng về khả năng xử lý concurrent và fault-tolerance.

📌 Tại sao chọn RabbitMQ?
• Routing cực kỳ linh hoạt với Exchange types
• Nhiều giao thức: AMQP, MQTT, STOMP, HTTP
• Management UI trực quan
• Plugin ecosystem phong phú
• Community lớn, tài liệu tốt

2. Kiến Trúc AMQP

┌────────────┐     ┌──────────┐     ┌─────────┐     ┌──────────┐
│  Producer  │────▶│ Exchange │────▶│  Queue  │────▶│ Consumer │
└────────────┘     └──────────┘     └─────────┘     └──────────┘
                        │
                   Routing Key +
                   Binding Rules

Luồng hoạt động:
1. Producer gửi message đến Exchange (kèm routing key)
2. Exchange kiểm tra binding rules
3. Route message đến Queue(s) phù hợp
4. Consumer nhận message từ Queue

3. Cài Đặt Bằng Docker

# Chạy RabbitMQ với Management Plugin
docker run -d \
  --name rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=secret123 \
  rabbitmq:3-management

# Kiểm tra container đang chạy
docker ps | grep rabbitmq

# Xem logs
docker logs rabbitmq

Docker Compose (khuyến nghị)

# docker-compose.yml
version: '3.8'
services:
  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    ports:
      - "5672:5672"    # AMQP port
      - "15672:15672"  # Management UI
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: secret123
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

volumes:
  rabbitmq_data:
# Khởi động
docker-compose up -d

# Management UI: http://localhost:15672
# Login: admin / secret123
💡 Port quan trọng:
5672: AMQP (applications kết nối)
15672: Management UI (web browser)
25672: Clustering (inter-node)

4. Management UI

Truy cập http://localhost:15672 để quản lý RabbitMQ:

📌 Các tab chính:
Overview: Tổng quan cluster, message rates
Connections: Danh sách client connections
Channels: AMQP channels (mỗi connection có nhiều channel)
Exchanges: Quản lý exchanges
Queues: Quản lý queues, xem messages
Admin: Users, permissions, policies

5. Virtual Host & Permissions

Virtual Host (vhost) là phân vùng logic trong RabbitMQ, tương tự database trong MySQL. Mỗi vhost có exchanges, queues, và permissions riêng.

# Tạo vhost mới
docker exec rabbitmq rabbitmqctl add_vhost /production
docker exec rabbitmq rabbitmqctl add_vhost /staging

# Tạo user mới
docker exec rabbitmq rabbitmqctl add_user app_user my_password

# Set permissions cho user trên vhost
# rabbitmqctl set_permissions -p <vhost> <user> <conf> <write> <read>
docker exec rabbitmq rabbitmqctl set_permissions -p /production app_user ".*" ".*" ".*"

# Set user tags (admin, monitoring, management)
docker exec rabbitmq rabbitmqctl set_user_tags app_user management

6. Hello World - Gửi Message Đầu Tiên

# Cài thư viện Node.js
npm init -y
npm install amqplib
// send.js - Producer
const amqp = require('amqplib');

async function send() {
    const conn = await amqp.connect('amqp://admin:secret123@localhost');
    const ch = await conn.createChannel();

    const queue = 'hello';
    const msg = 'Hello RabbitMQ! 🐰';

    await ch.assertQueue(queue, { durable: false });
    ch.sendToQueue(queue, Buffer.from(msg));

    console.log(`[x] Sent: ${msg}`);

    setTimeout(() => { conn.close(); process.exit(0); }, 500);
}

send();
// receive.js - Consumer
const amqp = require('amqplib');

async function receive() {
    const conn = await amqp.connect('amqp://admin:secret123@localhost');
    const ch = await conn.createChannel();

    const queue = 'hello';
    await ch.assertQueue(queue, { durable: false });

    console.log('[*] Waiting for messages...');

    ch.consume(queue, (msg) => {
        console.log(`[x] Received: ${msg.content.toString()}`);
    }, { noAck: true });
}

receive();
# Terminal 1: Chạy consumer
node receive.js

# Terminal 2: Gửi message
node send.js

📝 Tóm Tắt