Vấn đề: Tại sao hệ thống của bạn cần RabbitMQ?
Thử tưởng tượng bạn đang vận hành một sàn TMĐT với khoảng 1.000 đơn hàng mỗi phút. Nếu hệ thống bắt khách hàng đợi gửi xong email xác nhận mới báo “Đặt hàng thành công”, tỷ lệ thoát trang sẽ tăng vọt vì lag. Đây chính là lúc hệ thống bị nghẽn cổ chai do xử lý đồng bộ.
RabbitMQ giải quyết vấn đề này bằng cách đóng vai trò người điều phối. Thay vì đợi email gửi xong, hệ thống chỉ cần ném một yêu cầu vào hàng đợi (queue) rồi phản hồi ngay cho khách. Trên CentOS Stream 9, việc cài đặt không quá phức tạp. Tuy nhiên, nếu bạn chọn sai phiên bản Erlang, hệ thống sẽ gặp lỗi dependency liên miên.
Quick Start: Cài đặt RabbitMQ trong 5 phút
Nếu bạn đang vội, hãy sử dụng script từ Cloudsmith. Đây là cách nhanh nhất để lấy repository chính chủ mà không cần cấu hình thủ công từng dòng.
# 1. Cập nhật hệ thống
sudo dnf update -y
# 2. Thêm script hỗ trợ repo (Erlang và RabbitMQ)
curl -s https://setup.cloudsmith.io/rabbitmq/rabbitmq-erlang/script.rpm.sh | sudo bash
curl -s https://setup.cloudsmith.io/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
# 3. Cài đặt RabbitMQ Server
sudo dnf install rabbitmq-server -y
# 4. Kích hoạt dịch vụ
sudo systemctl enable --now rabbitmq-server
Hãy chạy lệnh sudo rabbitmqctl status để kiểm tra. Nếu thấy thông báo về version và node name hiện ra, bạn đã đi đúng hướng.
Tại sao phải cài Erlang riêng biệt?
Nhiều người thường dùng lệnh dnf install rabbitmq-server có sẵn của OS. Sai lầm này khiến bạn dễ dính các bản Erlang cũ kỹ và không tương thích. RabbitMQ được xây dựng trên nền tảng Erlang/OTP. Mỗi phiên bản RabbitMQ yêu cầu một dải version Erlang cực kỳ khắt khe để đảm bảo tính ổn định và hiệu suất.
Bước 1: Kích hoạt Giao diện quản trị (Management UI)
Gõ lệnh mãi cũng mệt, RabbitMQ cung cấp một Dashboard Web rất trực quan. Tại đây, bạn có thể theo dõi biểu đồ tin nhắn đi và đến theo thời gian thực.
# Bật plugin management
sudo rabbitmq-plugins enable rabbitmq_management
# Khởi động lại để áp dụng thay đổi
sudo systemctl restart rabbitmq-server
Bây giờ, bạn có thể truy cập qua port 15672. Lưu ý: User guest mặc định chỉ cho phép đăng nhập từ localhost vì lý do an toàn.
Bước 2: Thiết lập quyền quản trị
Việc đầu tiên tôi luôn làm sau khi cài đặt là xóa user mặc định và tạo tài khoản admin mới với mật khẩu đủ mạnh.
# Tạo user admin mới
sudo rabbitmqctl add_user tech_admin StrongPassword123!
# Gán quyền administrator
sudo rabbitmqctl set_user_tags tech_admin administrator
# Cấp toàn quyền trên vhost mặc định
sudo rabbitmqctl set_permissions -p / tech_admin ".*" ".*" ".*"
Nâng cao: Bảo mật đường truyền bằng SSL/TLS
Gửi tin nhắn qua giao thức amqp:// (plaintext) giống như việc bạn gửi bưu thiếp mà ai cũng có thể đọc được. Trong môi trường thực tế, dữ liệu nhạy cảm cần được mã hóa qua SSL/TLS (port 5671).
Mở file /etc/rabbitmq/rabbitmq.conf và thêm cấu hình sau:
listeners.ssl.default = 5671
ssl_options.cacertfile = /etc/rabbitmq/certs/ca_cert.pem
ssl_options.certfile = /etc/rabbitmq/certs/server_cert.pem
ssl_options.keyfile = /etc/rabbitmq/certs/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = false
Đừng quên cấp quyền cho RabbitMQ truy cập thư mục chứng chỉ bằng lệnh chown -R rabbitmq:rabbitmq /etc/rabbitmq/certs/.
Mở chặn Firewall trên CentOS Stream 9
CentOS 9 quản lý cổng rất chặt chẽ qua firewalld. Nếu không mở port, ứng dụng của bạn sẽ báo lỗi “Connection Refused”.
# Mở port cho AMQP và Management UI
sudo firewall-cmd --permanent --add-port={5672,5671,15672}/tcp
# Áp dụng thay đổi
sudo firewall-cmd --reload
Kinh nghiệm vận hành thực tế
Sau nhiều năm xử lý các sự cố về Message Broker, đây là 3 điểm bạn cần lưu tâm:
- Quản lý RAM: RabbitMQ mặc định sẽ chặn kết nối nếu RAM tiêu thụ vượt quá 40% tổng dung lượng server. Hãy điều chỉnh thông số
vm_memory_high_watermarknếu server của bạn có cấu hình đặc thù. - Ngưỡng ổ cứng: Nếu ổ cứng còn dưới 50MB trống, RabbitMQ sẽ ngừng nhận tin nhắn ngay lập tức. Tôi thường nâng ngưỡng này lên 2GB để tránh tình trạng hệ thống “chết lâm sàng” đột ngột.
- Chia Virtual Hosts (vhost): Hãy coi vhost như các database riêng biệt. Đừng bao giờ trộn lẫn dữ liệu của môi trường Dev và Production trên cùng một vhost.
Nếu gặp lỗi lạ, đừng đoán mò. Hãy kiểm tra ngay log tại /var/log/rabbitmq/. Đa phần các lỗi khởi động thất bại trên CentOS thường do SELinux chặn quyền đọc file hoặc sai cấu hình trong file .conf. Chúc các bạn triển khai thành công!

