[Phần 2]Sử dụng RabbitMQ trong C# (.NET) (thực hành)
Hi mọi người,
Tiếp nối lý thuyết phần 1: https://viblo.asia/p/phan-1su-dung-rabbitmq-trong-c-net-ly-thuyet-tong-quan-Ny0VG9DzJPA
Hôm nay mình sẽ chia sẻ về cách sử dụng RabbitMQ trong C# .Net 6. Bài viết sẽ giới thiệu các kiến thức cơ bản nhất về RabbitMQ và thực hành sử dụng RabbitMQ trong ứng dụng .NET 6.
Không để mọi người chờ lâu, cùng bắt đầu nào!
1. Cài đặt RabbitMQ bằng docker
- Đầu tiên phải chắc chắn máy đã cài docker. Nếu chưa cài bạn có thể xem hướng dẫn ở link: https://docs.docker.com/desktop/install/windows-install/
- Mở powershell và chạy lệnh để start server RabbitMQ trên docker.
docker run -d --name my-rabbit -p 8080:15672 -p 5673:5672 rabbitmq:3-management
- Ta sẽ đã cài đặt thành công RabbitMQ bằng docker chạy trên: http://localhost:8080/
- Để login ta sử dụng UserName: guest và Password: guest mặc định được tạo ra.
- Sau khi login ta sẽ có giao diện quản lý như dưới:
2. Tạo mới một user
- Ở phần 1 ta đã biết để có thể sử dụng rabbitMQ ta cần một user và password, có thể cấu hình các quyền cho từng user trên một virtual host nào đó.
- Để tạo mới một user ta vào giao diện RabbitMQ Management và vào tab admin
- Ta thêm mới một user và set permission cho user đó
-
Thiết lập quyền cho user truy cập đến virtual host
-
Vậy là ta đã thành công tạo mới một user: admin với password: 123.
-
Thử login vào http://localhost:8080/
3. Publish message bằng C# (.net 6)
-
Để có thể sử dụng RabbitMQ bằng .NET. Ta cài đặt package: RabbitMQ.Client trong NuGet package.
-
Create exchange. Mình nhắc lại lý thuyết ở phần 1 tí:
- Trong RabbitMQ thì message sẽ không gửi trực tiếp tới queue, thay vào đó message sẽ gửi qua exchange sau đó sẽ được routing tới queue phù hợp với header attributes, bindding key, routting pattern...
- Phần giải thích code mình sẽ viết bằng comment ở dưới.
using RabbitMQ.Client;
using System;
namespace RabbitMQNetCore
{
internal class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory()
{
HostName = "localhost",
Port = 5673,
UserName = "admin",
Password = "123",
VirtualHost = "/"
};
try
{
//Đầu tiên ta tạo mới một connection tới RabbitMQ với username, password và host name.
var connection = factory.CreateConnection();
var model = connection.CreateModel();
Console.WriteLine("Creating Exchange");
//Để tạo mới 1 exchange ta dùng hàm ExchangeDeclare với 2 params là exchange name và exchange type
model.ExchangeDeclare("demoExchange", ExchangeType.Direct);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}
-
Chạy chương trình ta đã tạo mới thành công 1 exchange
-
Ta có thể vào http://localhost:8080/#/exchanges để check xem exchange mới tạo
-
Tạo mới một Queue và Binding queue đó vào exchange
using RabbitMQ.Client;
using System;
namespace RabbitMQNetCore
{
internal class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory()
{
HostName = "localhost",
Port = 5673,
UserName = "admin",
Password = "123",
VirtualHost = "/"
};
try
{
var connection = factory.CreateConnection();
var model = connection.CreateModel();
//Console.WriteLine("Creating Exchange");
//// Create Exchange
//model.ExchangeDeclare("demoExchange", ExchangeType.Direct);
// Create Queue
model.QueueDeclare("demoqueue", true, false, false, null);
Console.WriteLine("Creating Queue");
// Bind Queue to Exchange
model.QueueBind("demoqueue", "demoExchange", "directexchange_key");
Console.WriteLine("Creating Binding");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}
-
Để tạo mới một Queue. Ta dùng hàm QueueDeclare (Queue: nơi lưu trữ tạm thời message, hoạt động theo cơ chế FIFO.)
- Giải thích: Nếu queue có Durable là true thì queue vẫn tồn tại thậm chí sau khi server restart.
- exclusive: true thì queue sẽ bị delete ngay khi connection bị disconnect.
- delete: true thì queue sẽ queue sẽ tự delete khi consumer cuối cùng cancel (connection của nó bị mất hoặc channel bị đóng)
-
Sau khi tạo mới một queue ta có thể vào http://localhost:8080/#/queues xem queue vừa tạo
Thông tin binding queue vào exchange
- Để publish một message tới một queue ta dùng hàm BasicPublish
using RabbitMQ.Client;
using System;
using System.Text;
namespace RabbitMQNetCore
{
internal class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory()
{
HostName = "localhost",
Port = 5673,
UserName = "admin",
Password = "123",
VirtualHost = "/"
};
try
{
var connection = factory.CreateConnection();
var model = connection.CreateModel();
var properties = model.CreateBasicProperties();
properties.Persistent = false;
byte[] messagebuffer = Encoding.Default.GetBytes("Direct Message");
model.BasicPublish("demoExchange", "directexchange_key", properties, messagebuffer);
Console.WriteLine("Message Sent");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}
-
BasicPublish sẽ nhận vào các tham số là exchange, routing key, properties và messagebuffer.
-
Ta có thể vào http://localhost:8080/#/queues để kiểm tra message đã publish
3. Tổng kết
- Vậy là chúng ta đã đi đã biết cách cài đặt và sử dụng cơ bản RabbitMQ trong .net 6.
- Cảm ơn mọi người đã xem bài viết. Chúc mọi người một cuối tuần vui vẻ.
- Nếu có thắc mắc về các phần trong bài này mọi người có thể inbox qua facebook:https://www.facebook.com/FriendsCode-108096425243996 Mình sẽ giải đáp thắc mắc trong tầm hiểu biết. Cảm ơn mọi người
Tham khảo
All rights reserved