ASP.NET 使用 MassTransit 與 RabbitMQ,實現事件發佈、訂閱

MassTransit 的架構是一個基於事件驅動和 Message 傳遞的分佈式系統架構,主要是要解偶服務之間的通訊。它使用 Message Broker(如 RabbitMQ、ActiveMQ、Kafaka、Azure Service Bus、Amazon SQS 等)來傳遞不同服務之間的訊息,它大大的簡化事件驅動的開發門檻

img

MassTransit 與 RabbitMQ 架構圖

下圖出自:MassTransit 知多少 | .NET 分布式应用框架 - 「圣杰」 - 博客园 (cnblogs.com)

img

消息流動過程

Producer,發布消息:

  • 生產者向 RabbitMQ 發布一個消息(如事件或命令)。

    • 通過 IPublishEndpoint.Publish:將事件廣播給所有訂閱了該事件類型的消費者。

    • 通過 ISendEndpoint.Send:將訊息發送到指定的佇列,通常用於點對點模式,確保只有一個消費者處理該訊息。

Message Broker (RabbitMQ):

  • 消息到達 RabbitMQ 的 Exchange,Exchange 根據配置的路由規則將消息轉發到一個或多個 Queue。這些規則可以根據消息類型、路由鍵等來進行配置。

  • Transport:跟 Message Boker 通訊的角色,負責發送和接收消息。

  • 支多個 Message Boker 例如:RabbitMQ、Azure Service Bus 或 Kafka。

Consumer,處理消息:

  • 消費者從 RabbitMQ 的 Queue 中取出消息,並通過實作 IConsumer 的方式來處理收到的消息。

    • IConsumer:處理從 Queue 接收到的事件或命令的消費者。

    • IReceiveEndpoint:接收端點,從 Transport 接收訊息反序列化後傳給消費者。

Message:消息合约,定義消息生產者和消息消費者之間的內容規範。

開發環境

  • Windows 11 Home

  • Rider 2024.2.6

  • .NET 8

  • rabbitmq:3-management

建立 RabbitMQ

docker-compose 內容如下

GUI 頁面如下所示

img

快速開始

建立一個 .NET 8 的 Web API 專案,

安裝套件

生產者發佈訊息

新增一個端點,使用 IPublishEndpoint.Publish 發佈事件

消費者處理訊息

消費者實作 IConsumer,並用 ConsumeContext 處理訊息

經中斷得知 ConsumeContext 內容如下

img

在 DI Container 配置 MassTransit⁠⁠ 的 Message Boker

完成之後應該就可以,試著尻 API

結果如下

生產者與消費者分開

上一個簡單的例子是把生產者跟消費者放在同一個專案,沒意外的話,真實的案場,兩者應該都是分開的

生產者(Producer)

ISendEndpoint:提供了 Send 方法,用於發送命令,由特定的消費者接收。 IPublishEndpoint:提供了 Publish 方法,用事件廣播,有訂閱的消費者都可以接收。

發送命令有幾種寫法

透過 DI Container 註冊後,建構子開一個洞讓它依賴以下

  • IBus

  • ISendEndpointProvider

ISendEndpointProvider

IBus

IBusControl

IBusControl 實作 IBus,除了可以透過 DI Container 之外,也可以自行建立執行個體

ConsumeContext

或者是在消費者端再次發送訊息,ConsumeContext 可以 Send 也可以 Publish

注意:上面這個例子,會造成無窮迴圈

消費者(Consumer)

Consumer,消費者用來消化消息,消費者可以訂閱某一個生產者的命令 quere,也可以訂閱生產者的廣播訊息,在 Hosting 配置好接收路徑,以及收到訊息要做甚麼事,基本上就設定好了。

案例位置

[sample.dotblog/Event Bus/MassTransit/Lab.MassTransit at 4549713ed44b723b6d68111a947b0a83d4bae9e0 · yaochangyu/sample.dotblog](https://github.com/yaochangyu/sample.dotblog/tree/4549713ed44b723b6d68111a947b0a83d4bae9e0/Event Bus/MassTransit/Lab.MassTransit)



健康檢查

配置 RabbitMQ 健康檢查的參數,以確保你的應用程序能夠正確地連接到 RabbitMQ

安裝套件

Program.cs 中添加 Health Check

啟動應用程序,然後在瀏覽器中訪問 https://localhost:7016/health,應該可以看到類似下面的畫面

Last updated