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

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/2/7

aot使用經驗總結

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

继续阅读