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

MassTransit 與 RabbitMQ 架構圖
下圖出自:MassTransit 知多少 | .NET 分布式应用框架 - 「圣杰」 - 博客园 (cnblogs.com)
消息流動過程
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 頁面如下所示
快速開始
建立一個 .NET 8 的 Web API 專案,
安裝套件
生產者發佈訊息
新增一個端點,使用 IPublishEndpoint.Publish 發佈事件
消費者處理訊息
消費者實作 IConsumer,並用 ConsumeContext 處理訊息
經中斷得知 ConsumeContext 內容如下
在 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


