- vừa được xem lúc

[Phần 2]Sử dụng RabbitMQ trong C# (.NET) (thực hành)

0 0 15

Người đăng: LongNguyen

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Message broker là gì? Sơ lược về RabbitMQ và ứng dụng demo

Trong kiến trúc cloud (hay microservices), các ứng dụng được chia thành những khối độc lập nhỏ hơn để có thể dễ dàng develop, deploy và maintain. Hãy thử tưởng tượng bạn có một kiến trúc cloud có nhiề

0 0 49

- vừa được xem lúc

Serving ML Models in Production with FastAPI and Celery

Overview. Bạn đang không biết triển khai mô hình Machine Learning của bạn cho dự án thực tế bạn đang làm thì đọc bài này là đúng rồi đó (đùa thui).

0 0 31

- vừa được xem lúc

Smallrye Reactive Messaging RabbitMQ với Quarkus

Mở đầu. RabbitMQ không còn là chủ đề mới lạ với anh em lập trình, tuy nhiên trong bài biết này mình giới thiệu tới mọi người kết nối tới RabbitMQ bằng smallrye trong Quarkus.

0 0 46

- vừa được xem lúc

[System design] - Redis vs Kafka vs RabbitMQ

Khi sử dụng giao tiếp không đồng bộ trong hệ thống microservice, phổ biến nhất đó là chúng ta sẽ sử dụng một message broker. Message broker đảm bảo giao tiếp giữa các microservice một cách đáng tin cậ

0 0 47

- vừa được xem lúc

Xây dựng RabbitMQ sử dụng Docker và Nodejs

RabbitMQ là gì. Đây là kiến trúc cơ bản của một message queue:. . Producer : là ứng dụng client, tạo message và publish tới broker.

0 0 21

- vừa được xem lúc

Tìm hiểu về RabbitMQ

1. Khái niệm.

0 0 18