Giới thiệu RabbitMQ - Message Broker mạnh mẽ
RabbitMQ là một open-source message broker phổ biến trong kiến trúc microservices, hỗ trợ nhiều messaging protocols như AMQP, MQTT, STOMP. Bài viết giới thiệu khái niệm cơ bản (Producer, Consumer, Queue, Exchange), cách cài đặt RabbitMQ, và ví dụ thực tế với .NET 8 để gửi/nhận messages. RabbitMQ giúp giải quyết các vấn đề về decoupling, scalability và reliability trong distributed systems.
RabbitMQ là một trong những message broker phổ biến nhất trong thế giới phát triển phần mềm hiện đại. Trong bài viết này, chúng ta sẽ tìm hiểu về RabbitMQ và cách sử dụng nó trong ứng dụng .NET 8.
RabbitMQ là gì?
RabbitMQ là một open-source message broker (còn gọi là message queue) được phát triển bởi Rabbit Technologies. Nó hỗ trợ nhiều messaging protocols như AMQP, MQTT, STOMP và HTTP thông qua các plugins.
Các khái niệm cơ bản
- Producer: Ứng dụng gửi message
- Consumer: Ứng dụng nhận và xử lý message
- Queue: Nơi lưu trữ message
- Exchange: Nhận message từ producer và định tuyến đến queue
- Binding: Quy tắc kết nối exchange với queue
- Routing Key: Khóa để exchange định tuyến message
Sơ đồ dưới đây ghép các khái niệm trên vào đúng ví dụ exchange logs ở phần 4:

Cài đặt RabbitMQ
Sử dụng Docker (Khuyến nghị)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Sau khi chạy, bạn có thể truy cập RabbitMQ Management UI tại: http://localhost:15672 (username/password: guest/guest)
Cài đặt trực tiếp
Tải và cài đặt từ rabbitmq.com
Ví dụ ứng dụng .NET 8
Chúng ta sẽ tạo một ứng dụng đơn giản để gửi và nhận message qua RabbitMQ.
1. Tạo project .NET 8
dotnet new console -n RabbitMQDemo
cd RabbitMQDemo
dotnet add package RabbitMQ.Client
2. Tạo Producer (Ứng dụng gửi message)
using RabbitMQ.Client;
using System.Text;
class Producer
{
static void Main(string[] args)
{
// Kết nối đến RabbitMQ
var factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "guest",
Password = "guest"
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
// Khai báo queue
const string queueName = "hello";
channel.QueueDeclare(
queue: queueName,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Console.WriteLine("Nhập message để gửi (nhập 'quit' để thoát):");
while (true)
{
var message = Console.ReadLine();
if (message?.ToLower() == "quit") break;
if (!string.IsNullOrEmpty(message))
{
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(
exchange: "",
routingKey: queueName,
basicProperties: null,
body: body);
Console.WriteLine($"Đã gửi: {message}");
}
}
}
}
3. Tạo Consumer (Ứng dụng nhận message)
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
class Consumer
{
static void Main(string[] args)
{
// Kết nối đến RabbitMQ
var factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "guest",
Password = "guest"
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
// Khai báo queue
const string queueName = "hello";
channel.QueueDeclare(
queue: queueName,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Console.WriteLine("Đang chờ message...");
// Tạo consumer
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($"Nhận được: {message}");
// Xác nhận đã xử lý message
channel.BasicAck(ea.DeliveryTag, false);
};
// Bắt đầu nhận message
channel.BasicConsume(
queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine("Nhấn Enter để thoát");
Console.ReadLine();
}
}