EasyNetQ-用於使用 RabbitMQ 的 .NET API 開源的工具庫

EasyNetQ-用於使用 RabbitMQ 的 .NET API 開源的工具庫

EasyNetQ 的目標是提供一個函式庫,用於在 .NET 中使用 RabbitMQ 盡可能簡單。

最後更新 2022/7/26 上午6:32
黑哥聊dotNet
預計閱讀 6 分鐘
分類
.NET
標籤
.NET C# 開源

Part1 介紹

EasyNetQ 是針對 RabbitMQ 的簡單易用 .NET API。

如果您只想盡快啟動並執行,請前往快速入門指南。

EasyNetQ 的目標是提供一個函式庫,讓在 .NET 中使用 RabbitMQ 變得盡可能簡單。為了達成這個目標,它透過強制執行一些簡單的慣例,以靈活性換取簡潔性。這些包括:

  • 訊息應該由 .NET 型別表示。
  • 訊息應按其 .NET 型別進行路由。

這表示訊息是由 .NET 類別定義的。您要傳送的每種不同訊息型別都由一個類別表示。該類別必須是公開的,必須具有預設建構函式和公開讀/寫屬性。您通常不會在訊息中實作任何功能,而是將其視為簡單的資料容器或資料傳輸物件 (DTO)。這是一個簡單的訊息:

public class MyMessage
{
    public string Text { get; set; }
}

EasyNetQ 按訊息型別路由訊息。當您發佈訊息時,EasyNetQ 會檢查其型別,並根據型別名稱、命名空間和組件為其提供路由鍵(routing key)。在消費端,訂閱者訂閱一個型別。訂閱一個型別後,該型別的訊息會被路由到訂閱者。

預設情況下,EasyNetQ 使用 Newtonsoft.Json 函式庫將 .NET 型別序列化為 JSON。這樣做的好處是訊息是人類可讀的,因此您可以使用 RabbitMQ 管理應用程式等工具來偵錯訊息問題。

Part2 API 設計

EasyNetQ 是在 RabbitMQ.Client 函式庫之上提供服務的元件集合。它們執行序列化、錯誤處理、執行緒封送、連線管理等操作。它們由 mini-IoC 容器組成。您可以很容易地用您自己的實作取代任何元件。因此,如果您想要 XML 序列化而不是內建 JSON,只需撰寫 ISerializer 的實作並將其註冊到容器中。

這些元件以 IAdvancedBus API 為前端。這看起來很像 AMQP 規範,實際上您可以從這個 API 執行大多數 AMQP 方法。此 API 對您隱藏的唯一 AMQP 概念是通道。這是因為通道是一個令人困惑的低階概念,一開始就不應該成為 AMQP 規範的一部分。老實說,「進階」對於這個 API 來說並不是一個很好的名稱,Iamqp 會好得多。

位於進階 API 之上的是一組訊息傳遞模式:發佈/訂閱請求/回應傳送/接收。這是 EasyNetQ 的「主見」部分。這是我們對如何實施這些模式的看法。靈活性很小;要麼您接受我們的做事方式,要麼您不使用它。目的是您,使用者,不必花費腦力去重新發明相同的模式;您不必在每次只想發佈和訂閱訊息時都做出選擇。它旨在實現 EasyNetQ 的核心目標,即盡可能輕鬆地使用 RabbitMQ

這些模式位於 IBus API 後面。再一次,這是一個糟糕的名稱,它與訊息匯流排的概念幾乎沒有關係。更好的名稱是 IPackagedMessagePatterns

IBus 旨在為 80% 的使用者、80% 的時間運作。這並不詳盡。如果您要實作的模式不是由 IBus 提供的,那麼您應該使用 IAdvancedBus。這樣做沒有問題,EasyNetQ 就是這樣設計的。

Part3 為什麼我需要 EasyNetQ?

RabbitMQ 不是已經有 .NET 用戶端了嗎?

是的,它確實。您可以在此處下載 .NET AMQP 用戶端函式庫。

那麼為什麼我需要 EasyNetQRabbitMQ .NET 用戶端實作了 AMQP 通訊協定的用戶端(而 RabbitMQ 實作了伺服器端)。AMQP 旨在作為訊息傳遞的 HTTP。它被設計成跨平台和語言無關的。它還旨在靈活地支援基於 Exchange/Binding/Queue 模型的各種訊息傳遞模式。

擁有這種靈活性很棒,但隨著靈活性而來的是複雜性。這表示您需要撰寫大量程式碼才能實現 RabbitMQ 用戶端。通常,此程式碼將包括:

  • 實作訊息傳遞模式,例如發佈/訂閱或請求/回應。雖然,公平地說,.NET 用戶端確實在此處提供了一些支援。
  • 實作路由策略。您將如何設計交換佇列繫結,以及如何在生產者和消費者之間路由訊息?- 實作訊息序列化/反序列化。您將如何將 AMQP 中訊息的二進位表示轉換為您的程式語言可以理解的內容?
  • 為訂閱實作消費者執行緒。您需要有一個專門的消費者迴圈來等待您訂閱的訊息。您將如何處理多個訂閱者或暫時性訂閱者,例如等待請求回應的訂閱者?
  • 實作訂閱者重新連線。如果連線中斷或 RabbitMQ 伺服器重新啟動,您如何偵測它並確保重建所有訂閱?
  • 了解並實作服務品質設定。您需要進行哪些設定以確保您擁有可靠的用戶端。
  • 實作錯誤處理策略。如果您的用戶端收到格式錯誤的訊息,或擲出意外例外狀況,您應該怎麼做?
  • 實作發佈者確認可靠訊息傳遞。

EasyNetQ 旨在將所有這些問題封裝在一個簡單易用的函式庫中,該函式庫位於現有 AMQP 用戶端之上。它是 RabbitMQ 在大容量商業環境中幾年使用經驗的結晶。

Part4 簡單使用

連接到 RabbitMQ 代理

var bus = RabbitHutch.CreateBus("host=localhost");

發佈訊息

await bus.PubSub.PublishAsync(message);

發佈一條延遲 5 秒的訊息

await bus.Scheduler.FuturePublishAsync(message, TimeSpan.FromSeconds(5));

訂閱訊息

await bus.PubSub.SubscribeAsync<MyMessage>(
    "my_subscription_id", msg => Console.WriteLine(msg.Text)
);

RPC 伺服器

await bus.Rpc.RespondAsync<TestRequestMessage, TestResponseMessage>(request =>
    new TestResponseMessage{ Text = request.Text + " all done!" }
);

Part5 網址

  • 原文連結:https://github.com/EasyNetQ/EasyNetQ/wiki/Introduction
  • 倉庫連結:https://github.com/EasyNetQ/EasyNetQ

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2026/2/7

AOT使用經驗總結

從專案建立伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 AOT 發布測試。

繼續閱讀