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 终结点在一夜中稳定运行。

原文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Introduction

EasyNetQ介绍的更多相关文章

  1. EasyNetQ使用(一)【介绍】

    EasyNetQ 是一个容易使用,专门针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与Rab ...

  2. C# .net 使用rabbitmq消息队列——EasyNetQ插件介绍

    EasyNetQ 是一个简洁而适用的RabbitMQ .NET类库,本质上是一个在RabbitMQ.Client之上提供服务的组件集合.

  3. .NET操作RabbitMQ组件EasyNetQ使用中文简版文档。

    本文出自EasyNetQ官方文档,内容为自己理解加翻译.文档地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Quick-Start EasyNetQ简介 Ea ...

  4. 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析

    对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP.NET WebAPI,ORM ...

  5. RabbitMQ安装配置和基于EasyNetQ驱动的基础使用

    一.RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Ra ...

  6. 【框架学习与探究之消息队列--EasyNetQ(1)】

    前言 本文欢迎转载,实属原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7603554.html 废话 既然都是废话了,所以大家就可以跳过了,这里是博主有事没事 ...

  7. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  8. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  9. .net core使用EasyNetQ做EventBus

    随着SOA.微服务.CQRS的盛行,EventBus越来越流行,上GitHub搜了一下,还是有蛮多的这类实现,老牌的有NServiceBus(收费).MassTransit,最近的有CAP(国人写的, ...

随机推荐

  1. 【ARTS】01_07_左耳听风-20181224~1230

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  2. mac ssh 自动登陆设置

    1.首先找到.ssh目录 一般在用户名目录下. ls -a查看 如果没有就重新创建一个 chennan@bogon :mkdir .ssh chennan@bogon 查看当前的 bogon:.ssh ...

  3. mysql 当前时间

    1.  mysql 获取当前时间 select now() ,current_timestamp(),localtimestamp(),sysdate() ,curdate(),curtime(),u ...

  4. MySQL安装与初步操作

    MySQL是一款出色的中小型关系数据库,做Java Web开发时,要做到数据持久化存储,选择一款数据库软件自然必不可少. 由于MySQL社区版开元免费,功能比较强大,在此以MySQL为例,演示MySQ ...

  5. Tomcat不同版本所对应的Servlet/JSP规范

    上午在别人机器上做演示,写好 Servlet居然访问不了.后来回想叻下,觉得应该是Tomcat版本不一致的问题,我用的是Tomcat 7.0建的Project,他们大多数都是用的6.0的版本.回来又仔 ...

  6. LeetCode(10):正则表达式匹配

    Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整 ...

  7. Mockito 简明教程

    什么是 Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDB ...

  8. IntelliJ IDEA快捷键:F12

    The F12 key moves the focus from the editor to the last focused tool window. 将焦点从编辑器移动到最后一个聚焦的工具窗口.

  9. appium入门级教程(1)—— appium介绍

    appium介绍 官方网站与介绍 1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用. “移动原生应用”是指那些用iOS或者 ...

  10. 2018年湘潭大学程序设计竞赛 F - maze

    把点抽出来 跑个最短路就好啦. #include<bits/stdc++.h> #define LL long long #define pii pair<int,int> # ...