Masstransit – Làm chủ message queue

Masstransit – Làm chủ message queue

October 5, 2021 1 By Nam Vu

Bài viết trước đó mình có đề cập đến “Messages Queue – Cách mà Microservice giao tiếp với nhau” và sau đó mình cũng có hướng dẫn cách về cách hiện thực hóa Message Queue với RabbitMQ Thuần. Ở bài viết này mình sẽ giới thiệu với các bạn một thư viện mã nguồn mở dành riêng cho DotNet khi có thể làm việc với nhiều loại Message Queue khác nhau. 

Đó chính là Masstranssit!

ntechdevelopers

Masstransit là một mã nguồn mở, nó free và là một bệ đỡ hoàn hoản khi sử dụng Message Queue và Message Bus (Mình sẽ có một bài viết riêng để phân biệt 2 thuật ngữ này sau nhé). Nó được sử dụng để tạo những hệ thống ứng dụng phân tán sử dụng công nghệ DotNet. 

Có thể nói rằng đây là một thư viện trừu tượng hóa những kiến trúc giữa các Message Brokers sử dụng để gửi nhận những messages bất đồng bộ.

Masstransit không chỉ hỗ trợ tích hợp được với RabbitMQ mà nó còn hỗ trợ được nhiều nền tảng khác như Azure Service Bus, ActiveMQ, Amazon SQS… Đây cũng chính là điểm mạnh nhất của nó khi mà nó không cần phải viết bất cứ một mã nguồn mở rộng nào để có thể tương thích với các nền tảng trên. Nó biển đổi trên các nền tảng chỉ thông qua cấu hình configuration mà thôi.

ntechdevelopers

Vậy khi nào thì dùng Masstransit và tại sao phải cần dùng nó?

Khi bạn xây dựng một hệ thống apply kiến trúc Microservices bạn sẽ phải chia tách các services sao cho chúng ít phụ thuộc vào nhau nhất có thể. Việc chia tách này khiến các services phải giao tiếp với nhau, có thể là đồng bộ hoặc bất đồng bộ khi này sẽ cần đến Mastransit. 

Để có thể trao đổi dữ liệu với nhau đầu tiên bạn phải cần một Broker, nó có thể là RabbitMQ có thể là Azure service bus. Việc lựa chọn ngay từ đầu này sẽ không vấn đề gì nếu bạn triển khai broker đó trên nền tảng của bạn, nhưng một ngày đẹp trời bạn có nhu cầu đổi Broker khác, khi này bạn sẽ phải triển khai lại từ đầu. Masstransit sinh ra giúp bạn để thay thế broker một cách dễ dàng và nhanh chóng.

Một lý do khác nữa đó chính là cơ chế khi message gửi hay nhận fail sẽ có những cơ chế quản lý circuit hay retry transaction. Ở điểm này thì Masstransit giúp chúng ta tinh chỉnh gói gọn dễ dàng xử lý hơn cho những trường hợp này.

Túm cái váy lại thì Masstransit có những ưu điểm sau:
– Miễn phí và là mã nguồn mở
– Dễ dàng sử dụng
– Xử lý được nhiều mô hình microservice message patterns
– Dễ dàng xử lý lỗi và các trường hợp ngoại lệ
– Xử lý phân tán Distributed Transaction (Mình có một bài viết riêng xử lý vấn đề này “Cách xây dựng một workflow thông qua masstransit saga state machine“)
– Dễ dàng kiểm thử
– Dễ dàng theo dõi và quản lý messages

Những điều cần lưu ý khi sử dụng Masstransit

Đối với message

– Message trong Masstransit sử dụng là kiểu dữ liệu của DotNet. Bạn có thể sử dụng class hoặc interface nhưng Masstransit khuyên rằng đối với các định nghĩa object message để làm contract giữa các service thì nên để thuộc tính read-only và không sử dụng methods trong object message.

– Masstransit hỗ trợ 2 cách để gửi một message. Đó là publishsend. Nó tương ứng với cơ chế point-to-pointpub/sub mà mình đã đề cập trong bài viết trước. Nếu bạn muốn gửi một event (khi bạn muốn thực hiện một việc khác ngay sau một việc)thì bạn phải sử dụng publish và nếu bạn muốn gửi command (khi bạn muốn ra lệnh thực hiện một việc nào đó) thì phải sử dụng send. Khi gửi một message đi nó sẽ gửi chính xác tới một queue name cụ thể và nó sẽ được cosumer nhận và xử lý message. Hiểu đơn giản là khi bạn muốn gửi 1-1 thì dùng send, việc được thực hiện sẽ kết thúc khi có một bên nhận được message và khi bạn muốn gửi 1-n thì dùng publish, việc sẽ được thực hiện đồng thời là với message giống hệt nhau trên mỗi consumer đăng ký trước đó.

ntechdevelopers

Các bước để implement Masstransit cũng giống như RabbitMQ mình đề cập trong bài viết trước.Nó sẽ gồm 5 bước chính:

– Định nghĩa channel connection sử dụng broker nào cả phía truyền và nhận.

– Định nghĩa queue name mà bạn muốn gửi message tới và khai báo gửi và nhận trên queue name đó. Có thể sử dụng send hoặc publish tùy yêu cầu.

– Định nghĩa contract với object message để chứa dữ liệu mong muốn. Lưu ý contract trong Masstransit thường kế thừa interface CorrelatedBy<Tkey>. Đây chính là buộc bạn phải chứa thêm CorrelationId trong mỗi object để phân biệt các message với nhau, nó cũng giúp cho bạn dễ dang tracing message của mình đã đi những đâu.

– Định nghĩa consumer nhận và xử lý message sau khi nhận.- Gọi hàm send hoặc publish tại nơi mà bạn muốn gửi message đi.

Bạn có thể tham khảo code demo tại github của mình nhé!

Trên đây là bài viết chi tiết về Masstransit và cách thực hiện hóa Message Queue với công nghệ này. Để có thể tìm hiểu sâu hơn bạn có thể truy cập vào trang chủ của Massatransit tại
https://masstransit-project.com/getting-started/

Cám ơn các bạn đã quan tâm.

#ntechdevelopers