EasyNetQ 介绍

EasyNetQ 是一个容易使用,坚固的,针对 RabbitMQ 的 .NET API。

假如你尽可能快的想去安装和运行 RabbitMQ,请去看入门指南
EasyNetQ是为了提供一个尽可能简洁的适用与 RabbitMQ的.NET 类库。为了实现这些目标,EasyNetQ 提供一种自认为你会在 .NET 下使用 RabbitMQ 的视图。为了保持使用灵活性,简单起见,EasyNetQ 强制使用了一些简单的约定。包括如下:

  • 消息用 .NET 类型表示
  • 消息通过.NET类型路由

这意味着消息必须用 .NET class 定义。每一个你想发送的不同的消息类型必须用一个 class 表示。这个类必须是 public 并带有一个默认构造函数和可以读写的属性。在这个消息中,你通常不需要实现任何功能。仅仅把这个消息单做一个简单的数据容器或者DTO。下面是一个简单的消息。

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

EasyNetQ 通过消息的类型来路由。当你发布一个消息,EasyNetQ 会检查消息类型, 然后给它一个基于类型名称、命名空间和程序集的路由键。在消费者端,消费者去订阅这个类型。在订阅这个类型之后,消费者就会得到这个类型的消息。

默认情况下,EasyNetQ 使用 Newtonsoft.Json 序列化 .NET 类型为 JSON。这样有一个好处就是消息对与人类可读性好。因此你能够使用类似于 RabiitMQ 管理端应用去调试消息问题。

API 设计

EasyNetQ 是一个在 RabbitMQ.Client 类库之上提供服务的组件集合。做了这些事情,像序列化、错误处理、线程管理、连接管理等。通过一个 Mini-Ioc 容器组织在一起。你能很容易用你自己实现去替换这些组件。所以如果你喜欢用XML 序列化而不是用JSON,仅仅需要以一个 ISerializer 的实现,然后注册到这个容器中。

这些组件最上层是 IAdvancedBus API。这看起来很像 AMQP 规格。实际也是你能够通过这个 API 运行很多 AMQP 方法。这个 API 对你隐藏了唯一 AMQP 概念是 channels。这是因为 channels 是一个复杂的底层概念,不应该被放到 AMQP 部分规格的第一的位置。 坦白来说,这个API中 ‘Advanced’ 不是一个非常好的名字。用 ‘lamqp’ 可能更好些。

这个顶层高级 API 是一系列消息模式:Publish/Subscribe、Request/Response 和 Send/Receive。这是 EasyNetQ 坚持的设计思想。这些模式是我们应该实现的。这样有非常小的弹性。要么你接受我的处理方法,或者你就不要去使用。这样做的目的是,不用你和使用者花费精力去重新发明轮子。你不需要每一次去做选择,你只需要简单的去Publish和Subscribe消息。这样设计是未来实现 EasyNetQ 的核心目标,即尽可能简单的使用RabbitMQ。

这些模式的后面是这个 IBus API。 再一次看到这个一个简单的名字,它跟消息总线概念有关。IPackagedMessagePatterns 可能是一个更好名字。

80% 的用户的工作,在 80% 的时间都会使用 IBus。它不是完备的API,如果这个模式下,你想实现的功能这个 IBus 没有提供,那么你应该使用 IAdvancedBus。这样使用没有问题,EasyNetQ 就这这样设计使用的。

为什么我需要EasyNetQ?

RabbitMQ 不是已经有了 .NET client?
确实如此。你可以在这里下载 .NET AMQP 客户端类库。

那么为什么我需要 EasyNetQ 呢?RabbitMQ .NET client 实现了 AMQP 协议的客户端( RabbitMQ 实现了服务器端)。 AMQP 是为 HTTP 协议设计的,它的设计是跨平台的和与语言无关的。它也旨在灵活支持多种基于交换/绑定/队列模型的消息传递模式。

RabiitMQ Client 非常地灵活,但是伴随着灵活性而来是复杂性。这意味着你为了需要写大量代码,以便执行 RabbitMQ client。通常,这些代码包括一下这些:

  • 实现消息传递模式,例如 Publish/Subscribe 或 Request/Response。尽管,公平来讲,这个 .NET client 也提供了一些这样的支持。
  • 实现路由策略。你将需要设计你如何去 exchange-queue 绑定。并且你将设计怎样在生产者和消费者之间进行消息路由。
  • 实现消息的序列化/反序列化。 你将如何转换 AMQP 的二进制消息为你编程语言能理解的格式?
  • 为订阅去实现一个消费者线程。你将需要有一个专门的消费者循环等待你订阅的消息。你会如何处理多个订阅者,或者瞬间订阅者,像哪些等待答复的请求。
  • 实现消费者重新连接。假如连接崩溃了或者 RabbitMQ 服务挂了,你怎样能检测到并确保你所有的订阅都能被重建?
  • 懂得和实施服务质量设置。你需要什么样的设置来确保一个可靠的客户端。
  • 实现一个错误处理策略。假如接受到一个错误的消息,或者发生一个未处理异常被抛出,你的客户端应该做什么呢?
  • 实现发布者可靠的消息确认。

EasyNetQ 目标是在 AMQP 之上封装所有这些关注点在一个简单好用的类库中。EasyNetQ 有在高容量商业环境中数年使用 RabbitMQ 的经验。

性能评估

EasyNetQ 的性能直接跟 RabbitMQ broker 的性能相关。这可能随着网络和服务器性能不同而不同。在一个开发者机器上用本地 RabbitMQ 实例上测试,持续通宵执行实现了每秒 50002K 消息送到。每个 EasyNetQ 终结点在一夜中稳定运行。

原文地址:Introduction · EasyNetQ/EasyNetQ Wiki · GitHub

Guess you like

Origin blog.csdn.net/ChaITSimpleLove/article/details/116606988