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.这样有一个好处就是消息对与人类可读性好。因此你能够使用类似于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坚持的设计思想。这些模式是我们应该实现的。这样有非常小的弹性。要么你接受我的处理方法,或者你就不要去使用。这样做的目的是,不用你和使用者花费精力去重新发明轮子。你不需要每一次去做选择,你只需要简单的去PublishSubscribe消息。这样设计是未来实现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/SubscribeRequest/Response。尽管,公平来讲,这个 .NET client也提供了一些这样的支持。
  • 实现路由策略。你将需要设计你如何去 exchange-queue 绑定。并且你将设计怎样在生产者和消费者之间进行消息路由。
  • 实现消息的序列化/反序列化。 你将如何转换AMQP的二进制消息为你编程语言能理解的格式?
  • 为订阅去实现一个消费者线程。你将需要有一个专门的消费者循环等待你订阅的消息。你会如何处理多个订阅者,或者瞬间订阅者,像哪些等待答复的请求。
  • 实现消费者重新连接。假如连接崩溃了或者RabbitMQ 服务挂了,你怎样能检测到并确保你所有的订阅都能被重建?
  • 懂得和实施服务质量设置。你需要什么样的设置来确保一个可靠的客户端。
  • 实现一个错误处理策略。假如接受到一个错误的消息,或者发生一个未处理异常被抛出,你的客户端应该做什么呢?
  • 实现发布者可靠的消息确认。

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

性能评估

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

EasyNetQ.NET 的消息队列库,它提供了个简单直观的方式来使用 RabbitMQ。RabbitMQ 是个开源的消息代理软件,它实现了高级消息队列协议(AMQP)。使用 EasyNetQ 可以方便地在 .NET 应用程序中集成消息传递功能,实现分布式系统间的消息通信。 要在 .NET 项目中使用 EasyNetQ,你需要遵循以下步骤: 1. 安装 EasyNetQ 包:使用 NuGet 包管理器安装 EasyNetQ。你可以在 Visual Studio 的包管理控制台中运行以下命令来安装它: ``` Install-Package EasyNetQ ``` 2. 连接到 RabbitMQ 服务器:创建个 `IBus` 的实例,它将作为消息传递的总线。你可以使用以下代码来连接到本地的 RabbitMQ 服务器或者指定的服务器: ```csharp var bus = RabbitHutch.CreateBus("host=localhost"); ``` 如果需要配置连接参数,如用户名、密码、端口等,可以使用 `CreateBus` 方法的重载版本,并传递配置信息。 3. 发送消息:使用 `IBus` 实例来发布消息。你可以调用 `Publish` 方法来发送消息到指定的队列或者交换机: ```csharp bus.Publish(new MyMessage { Content = "Hello World!" }); ``` 其中 `MyMessage` 是你定义的个类,它需要标记有 `[Serializable]` 属性或者实现 `ISerializable` 接口。 4. 接收消息:你可以订阅队列中的消息,使用事件处理模式或者请求响应模式来接收消息。以下是个简单的事件处理模式的例子: ```csharp bus.Subscribe<MyMessage>("mySubscriptionId", message => { Console.WriteLine("Received: {0}", message.Content); }); ``` 5. 销毁 `IBus` 实例:为了确保所有的消息都发送完成,资源得到释放,你需要在应用程序关闭时销毁 `IBus` 实例: ```csharp bus.Dispose(); ``` 使用 EasyNetQ 的好处包括: - 简化了使用 RabbitMQ 的复杂性。 - 提供了直观的 API 来处理消息的发布和订阅。 - 支持消息序列化和反序列化的简化处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值