← Về danh sách bài họcBài 6/20
🐰 Bài 6: RabbitMQ - Giới Thiệu & Cài Đặt
🎯 Sau bài học này, bạn sẽ:
- Hiểu RabbitMQ là gì và kiến trúc AMQP
- Cài đặt RabbitMQ bằng Docker
- Sử dụng Management UI
- Hiểu Virtual Host, User, Permission
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
• 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
• 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
- RabbitMQ = message broker AMQP, viết bằng Erlang
- Cài đặt dễ dàng với Docker
- Management UI tại port 15672
- Virtual Host phân vùng logic cho environments
- Hello World:
amqplib+ sendToQueue + consume