Part1介紹
EasyNetQ 的目標是提供一個庫,用于在 .NET 中使用 RabbitMQ 盡可能簡單。為了做到這一點,它通過強制執行一些簡單的約定來以靈活性換取簡單性。這些包括:
消息應該由 .NET 類型表示。消息應按其 .NET 類型進行路由。這意味著消息是由 .NET 類定義的。您要發送的每種不同的消息類型都由一個類表示。該類必須是公共的,必須具有默認構造函數和公共讀/寫屬性。您通常不會在消息中實現任何功能,而是將其視為簡單的數據容器或數據傳輸對象 (DTO)。
默認情況下,EasyNetQ 使用 Newtonsoft.Json 庫將 .NET 類型序列化為 JSON。
Part2API設計
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 客戶端了嗎?
那么為什么我需要 EasyNetQ?RabbitMQ .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