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

转载于:https://www.cnblogs.com/Jeely/p/10784555.html

转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html相关推荐

  1. 2-用EasyNetQ连接RabbitMQ(黄亮翻译)

    如果你连接过关系数据库,例如SQL Server.你会发现EasyNetQ处理connections有点奇怪.和关系数据库通讯一直都是通过client开始的.Client 打开一个连接, 发出一个SQ ...

  2. C# (转载)webbrowser专题(参考资料:https://www.cnblogs.com/blogpro/p/11458390.html)

    C# .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 2 Study Case 4:高亮显示 上一个例子中我们学会了查找文本--究跟到底,对Web页面还是只读不写.那么,如 ...

  3. ELK架构设计介绍(转:https://www.cnblogs.com/aresxin/p/8035137.html)

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...

  4. [转载]IPMSG(飞鸽传书)协议翻译

    /********************************************************** *本人(ypxing)根据下面的协议,C语言写的ipmsg(聊天,文件/文件夹传 ...

  5. GitHub官方介绍(中文翻译)

    注:本人亲自翻译,转载请注明出处. 官方链接地址 http://guides.github.com/activities/hello-world/ Hello World 项目在计算机编程界是一项历史 ...

  6. 【转载】 详细介绍Flex中操作XML

    一  在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为"元素"     节点:把XML元素与文本结合起来统称为节 ...

  7. [转载]搜索引擎技术介绍

    转载声明:http://backend.blog.163.com/blog/static/202294126201252872124208/ 引言 早些时候分享过一份关于搜索引擎技术的PPT,这篇文章 ...

  8. 【转载收藏】介绍一种百度盘高速下载方式 - Pandownload网页版

    [转载收藏]介绍一种百度盘高速下载方式 - Pandownload网页版 百度盘高速下载软件Pandownload推出了网页版,我测试了下还挺好用的,下载速度不错,网页版在pc和手机上都可以用,对于偶 ...

  9. 大学生学计算机的自我介绍范文带翻译,2016大学生英语自我介绍范文带翻译

    2016大学生英语自我介绍范文带翻译 自我介绍是向别人展示自己的一个重要方式,直接关系到给别人的第一印象,以及能否 与陌生人建立关系.打开局面等,本文是学习啦小编为大家整理的大学生英语自我介绍范文带翻 ...

最新文章

  1. 图像分割2020总结:结构,损失函数,数据集和框架
  2. 使用Hyperledger Ursa简化区块链安全性
  3. python 命令行参数-Python 获得命令行参数的方法(推荐)
  4. 3D脚本 maxscript入门教程(6)
  5. Android OpenGL ES(十)绘制三角形Triangle .
  6. 二元偏导数存在的条件_多元函数 可导、可微、连续、一阶偏导数连续 之间关系的总结...
  7. 在C#中如何读取枚举值的描述属性
  8. 【转】vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限...
  9. 西门子PLC中各个组织块OB作用(OB1、OB100……)
  10. 条码扫描枪的连接与使用方法
  11. SQL:查询各科成绩前三名
  12. matlab quadratic,请教几个quadratic programming的问题
  13. 读薄《高性能MySql》(三)索引优化
  14. 《MATLAB 神经网络43个案例分析》:第5章 基于BP_Adaboost的强分类器设计——公司财务预警建模
  15. 读彼得林奇的成功投资有感
  16. Java面试——数据库
  17. homeassistants应用1-家庭监控摄像头
  18. Navicat工具数据库表结构导出 word编写数据库设计文档
  19. pbootcms如何设置网站xml地图
  20. 如何搭建企业培训平台

热门文章

  1. NET插件系统之四——提升系统搜索插件和启动速度的思考
  2. 初识Mongodb总结
  3. Leetcode 143. 重排链表
  4. Leetcode 160.相交链表
  5. 人工智能学什么?专家表示基础科学教育需发力
  6. ei加声调怎么加_空调怎么加氟 空调加氟方法【介绍】
  7. 042_JDK的Map接口
  8. java sqlite mybatis_Spring boot + Mybatis + SQLite 搭建blog API
  9. android 横向滑动事件,android左右手势滑动事件处理
  10. layui 按钮点击一次后失效_00017-layui 对话框 layer.open 点击保存,按钮失效,保存完后,再恢复...