RabbitMQ trong ASP.NET Core

Danh Luu | 4/25/2022 2:03:14 AM

Trong bài trước chúng ta đã học về Kiến trúc Microservices trong .NET Core. Trước khi đọc bài này, mình khuyên các bạn nên đọc bài đấy trước. Trong bài viềt này, ta cùng tìm hiểu về một khía cạnh khác, đó là Microservices Communication sử dụng RabbitMQ. Chúng ta sẽ thực hiện cho các microservices giao tiếp với nhau bằng cách sử dụng RabbitMQ và MassTransit

Table of Contents

RabbitMQ là gì?

RabbitMQ là một Message-Broker Service phổ biến. Nó hỗ trợ nhiều giao thức giúp các service có thể giao tiếp được với nhau. Về cơ bản. nó cung cấp cho ứng dụng của bạn một nền tảng chung cho việc gửi và nhận messages. Nó đảm bảo rằng messages(data) của bạn sẽ không bao giờ mất và sẽ được thực hiện thành công. Về cơ bản, thì bạn sẽ có 1 con server riêng, mỗi request gửi lên sẽ gửi thông qua con server đấy, server đấy sẽ đẩy request vào hàng đợi, sau đó thực hiện request đó và trả về cho người dùng. Server này sẽ lưu message vào 1 Queue (hàng đợi) , nhiều request từ nhiều service khác nhau có thể được lưu trong hàng đợi này. Mỗi khi có một message mới, từng người đăng ký dịch vụ này sẽ nhận được nó. Một ứng dụng có thể hoạt động vừa là ứng dụng nguồn (Producer) vừa là điểm đến (Consumer) dựa trên những gì bạn cấu hình

 

Một số thuật ngữ liên quan đến RabbitMQ

Để đảm bảo bài viết truyền tải được nội dung chính xác nhất, Tino Group sẽ giữ nguyên rất nhiều từ tiếng Anh. Tuy nhiên, bạn có thể tham khảo những khái niệm, những từ tiếng Anh Tino Group giữ nguyên tại đây:

  • Producer: Ứng dụng/ chương trình gửi message.
  • Consumer: Ứng dụng/ chương trình nhận message.
  • Queue: Hoạt động lưu trữ các message.
  • Message: hay tin nhắn là thông tin được Producer truyền đến Consumer thông qua message broker (trong bài viết là RabbitMQ).
  • Connection: là kết nối TCP giữa ứng dụng/ chương trình và message broker.
  • Channel: là kết nối ảo trong một Connection là môi trường để thực hiện các hoạt động như publishing, consuming message từ queue.
  • Exchange: Là nơi nhận message được publish từ Producer và đẩy chúng vào queue dựa vào quy tắc của từng loại Exchange. Sẽ phân tích rõ hơn ở phần sau.
  • Binding: là quy tắcrule, Exchange có nhiệm vụ liên kết và routing message đến queue.
  • Routing key: Một key mà Exchange dựa vào đó để quyết định cách để định tuyến message đến queue. Có thể hiểu nôm na, Routing key là địa chỉ dành cho message.
  • AMQP Advanced Message Queuing Protocol: là một giao thức (protocol) truyền message được sử dụng trong RabbitMQ.
  • User: hay người dùng, mỗi người dùng sẽ có tài khoản, mật khẩu khác nhau và những quyền hạn nhất định được phân cụ thể trong RabbitMQ.
  • Virtual host hay viết tắt là Vhost: hay máy chủ ảo, là một phương thức cho phép lưu trữ các ứng dụng khác nhau dùng chung RabbitMQ instance. User khác nhau sẽ có quyền khác nhau với các Vhost; Queue và Exchange sẽ chỉ tồn tại trong một Vhost.

RabbitMQ giúp các web server gửi các reponse cho các request rất nhanh thay vì bị ép buộc chạy một procedure ngốn tài nguyên trên một hệ thống. Việc đưa message vào hàng đợi là một giải pháp hay khi ta muốn phân tán message cho nhiều người nhận giúp giảm tải cho các worker xử lý.

VD như user được phép tạo file PDF cho mẫu cv it từ phần mềm tạo CV Online của TopDev, bài toán là khi hàng nghìn user cùng nhấp vào nút tạo PDF, lúc này server nhận rất nhiều request sẽ gây ra vài vấn đề như chậm, quá tải, thậm chí không tạo được file PDF do nghẽn…lúc này chúng ta cần dùng RabbitMQ để đẩy các request này vào hàng chờ. Cơ chế như sau:

Một consumer lấy message từ hàng đợi và bắt đầu xử lý PDF trong lúc với một producer đang bỏ thêm những message mới vào trong hàng đợi. Một request có thể được tạo bằng ngôn ngữ này và xử lý bằng một ngôn ngữ khác. Hai ứng dụng trao đổi với nhau qua các message. Do đó, hai ứng dụng gửi và nhận sẽ có độ ràng buộc thấp.

https://topdev.vn/blog/rabbitmq-la-gi/

Môt message có tể bao gồm bất kỳ loại thông tin nào, từ 1 chuối string đơn giản tới các object phức tạp. RabbitMQ lưu dữ liệu này trong máy chủ cho đến khi consumer cần và lấy message ra khỏi hàng đợi

RabbitMQ cung cấp 1 giao diện dashboard để quản lý các Message Queue dễ dàng hơn

Những lợi ích của RabbitMQ

  1. Khả năng mở rộng cao: Bạn sẽ không bị pphuj thuộc vào 1 VM / processor / server để xử lý các request.  When it get’s to the point where you first server finds it tough to process the incoming queue data, you can simply add another server that can share the load and improve the overall response time. This is quite easy with the queue concept in RabbitMQ.
  2. Clean User Experience – You users are less likely to see any errors, thanks to the microservice based message broker architecture.
  3. Higher availability – Even if the main Microservice is down to a technical glitch on on-going update, the messages are never lost. It gets stored to the RabbitMQ server. Once the Service comes online, it consumes the pending messages and processes it.

Workflow của RabbitMQ, Consumer thử 3 sẽ Offline trong một thời gian nhất định, điều này sẽ không ảnh hưởng tới tính toạn vẹn của hệ thống. Thậm chí tất cả các Consumer đều offline, message vẫn sẽ được nằm trong RabbitMQ và đợi cho tới khi Consumer Online trở lại and take the message off their particular queues.

Những gì chúng ta sẽ làm

Chúng ta sẽ xây dựng một ứng dụng nơi người dùng có thể đặt vé. Chúng ta sẽ có 2 Microservices. Người dùng đặt vé ở phía front-end, Back-end sẽ có một phương thức POST để đặt vé, Chi tiết vé sẽ được gưi tới hàng đợi RabbitMQ, sau này sẽ được sử dụng bởi OrderProcessing Microservice. Dữ liệu sẽ được lưu trong database và người dùng sẽ được thông báo về trạng thái đơn hàng qua email

Tại sao lại dùng RabbitMQ trong kịch bản này? Ta cần đảm bảo tất cả các đơn hàng sẽ không bị mất hoặc phải chờ quá nhiều thời gian để xử lý, giả sử có rất nhiều người đặt vé cùng 1 lúc, nếu không dùng Message Queue có thể sẽ mất đi 1 vài request hoặc các request được gửi liên tục dẫn đến thời gian xử lý chậm. Điều gì sẽ xảy ra nếu OrderProcesscing Microservice (Tiến trình đặt hàng) Offline? Người dùng sẽ được thông báo rằng đơn hàng đã được xác nhân, vui lòng đợi, khi OrderProcessing online trở lại, nó sẽ được tiếp tục thực hiện

Cài đặt môi trường

Môi trường sử dụng là ASP.NET Core 3.1 WebAPI

Sau đó ta cần thiết lập RabbitMQ Server 

Cài đặt Erlang

Erlang là một ngôn ngữ lập trình mà máy chủ RabbitMQ được xây dựng trên đó. Khi cài đặt RabbitMQ Server chạy trên local (Windows), hãy đảm bảo máy bạn có cài Erlang trước

Cài Erlang tại đây: https://www.erlang.org/downloads

Cài đặt với quyền Administrator

Cài đặt RabbitMQ

RabbitMQ cho windows: https://www.rabbitmq.com/install-windows.html.

Kích hoạt Plugin quản lý RabbitMQ - Dashboard

Sau khi cài xong, ta cần kích hoạt Management Dashboard. Mở Command Promt với quyển Admin, sau đó chạy những lệnh sau

cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.7\sbin
rabbitmq-plugins enable rabbitmq_management
net stop RabbitMQ
net start RabbitMQ

Sau khi chạy xong, ta vào http://localhost:15672/, đây sẽ là trang chủ quản lý RabbitMQ

http://localhost:15672/ Cổng mặc định của RabbitMQ

username/password mặc định sẽ là guest/guest

Bạn có thể quản lý user trong Admin tab

Bắt đầu với RabbitMQ trong .NET Core

Tiếp theo chúng ta sẽ xây dựng các Microservices có thể tương tác với nhau thông qua RabbitMQ

Tạo 1 Blank Solution ‘Microservices.Ticketing.WebApi’


Tags: Microservice
Web hosting by Somee.com