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
.这样有一个好处就是消息对与人类可读性好。因此你能够使用类似于RabbitMQ
管理端应用去调试消息问题。
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
终结点在一夜中稳定运行。