zoukankan      html  css  js  c++  java
  • EasyNetQ笔记-1介绍

    介绍:

    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?那么为什么我需要EasyNetQ呢?
    RabbitMQ .NET client 实现了AMQP协议的客户端(RabbitMQ实现了服务器端)。 AMQP是为HTTP协议设计的。它的设计是跨平台的和与语言无关的。它也旨在灵活支持多种基于交换/绑定/队列模型的消息传递模式。
    RabiitMQ Client 非常地灵活,但是伴随着灵活性而来是复杂性。这意味着你为了需要写大量代码,以便执行RabbitMQ client。
    通常,这些代码包括一下这些:

    • 实现消费者重新连接。假如连接崩溃了或者RabbitMQ 服务挂了,EasyNetQ将恢复轮询终结点直到重新连接成功
    • 实现消息传递模式,例如Publish/Subscribe或Request/Response。尽管,公平来讲,这个 .NET client也提供了一些这样的支持。
    • 实现路由策略。你将需要设计你如何去 exchange-queue 绑定。并且你将设计怎样在生产者和消费者之间进行消息路由。
    • 实现消息的序列化/反序列化。 你将如何转换AMQP的二进制消息为你编程语言能理解的格式?
    • 为订阅去实现一个消费者线程。你将需要有一个专门的消费者循环等待你订阅的消息。你会如何处理多个订阅者,或者瞬间订阅者,像哪些等待答复的请求。
    • 懂得和实施服务质量设置。你需要什么样的设置来确保一个可靠的客户端。
    • 实现一个错误处理策略。假如接受到一个错误的消息,或者发生一个未处理异常被抛出,你的客户端应该做什么呢?
    • 实现发布者可靠的消息确认。
      EasyNetQ目标是在AMQP之上封装所有这些关注点在一个简单好用的类库中。EasyNetQ有在高容量商业环境中数年使用RabbitMQ的经验。

    连接字符串

    使用EasyNetQ最简单的办法是通过IBus接口,标准的做法是在你应用的生命周期内只创建一个IBus实例.当你的应用关闭后Dispose掉它。
    创建一个IBus实例如下:

    var bus = RabbitHutch.CreateBus("host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret");
    //关闭连接、信道、Consumer等所有资源
    bus.Dispose();
    

    连接字符串:

    host(例如 host=192.168.2.56)这个字段是必选的。如要具体指定你要连接服务器端口,你用标准格式 host:port(例如:host=myhost.com:5673)。假如你省略了端口号,AMQP默认端口是5672.连接到RabbitMQ集群,需要指定每一个集群节点用逗号分隔(例如:host:myhost1.com,myhost2.com,myhost3.com).详情参考Cluster Support

    virtualhost(例如:virtualHost=myVirturalHost)默认虚拟主机是’/’

    username(例如:username=mike)默认是’guest’(对于非’localhost’主机你需要使用其他用户名)

    password (例如:password=mysecret)默认为’guest’

    requestedHearbeat(例如:requestHearbeat=10)默认为10秒钟。没有心跳设置为0

    prefetchcount(例如:prefetchcount=1) 默认为50.这个值是在EasyNetQ发送ack之前发送给RabbitMQ的消息数。不限制设置为0(不推荐). 为了在消费者之间保持公平和平衡设置为1.

    publisherConfirms(例如:publisherconfirms=true)默认是false。生产者到exchange消息有没有发送成功

    persistentMessages(例如:persistentMessages=false)默认为true。这个决定了在发送消息时采用什么样的delivery_mode。 false=1,true=2. 设置为true,RabbitMQ将会把消息持久化到磁盘,并且在服务器重启后仍会存在。设置为false可以提高性能收益。

    product(例如:product=我的现实中重要的服务)在EasyNetQ 0.27.3中被引进。默认值是Bus的实例名。此处输入的值将显示在RabbitMQ的后台管理界面中。

    platform(例如:platform=my.fully.qualified.domain.name)在EasyNetQ 0.27.3中被引进。默认值是运行着客户端处理Bus的实例的机器的主机名。此处输入的值将会线上在RabbitMQ管理端界面中。

    timeout(例如:timeout=60)模式值为10秒。同步bus.Publish(..)方法将在返回之前等待确认,发布确认超时时间,0到65535范围内的值。不限制超时时间设置为0.当超时事时抛出System.TimeoutException.

    publisherConfirms配置说明:

    publisherConfirms是指发布确认,当值为true时,发布者需要确认消息发送到消息队列成功,发送成功取决于以下几种情况:
    非持久化消息入队后会被确认
    持久化消息被持久化到硬盘会被确认
    一条无法路由的非持久化消息直接被确认
    参考:https://github.com/EasyNetQ/EasyNetQ/wiki/Publisher-Confirms

    参考:
    https://github.com/EasyNetQ/EasyNetQ/wiki/Quick-Start
    https://www.cnblogs.com/forcesoul/category/1125580.html

  • 相关阅读:
    启动程序相关的命令
    分享的几行代码
    各种大数据软件安装
    tomcat报没法分配内存大小解决方案
    数据库事务
    pytorch之CNN实现
    搜索与匹配
    调试 pytorch 及 python 的 特殊语法
    图神经网络 GCN 等综述(转载)
    关于【finder不能完成该操作 因为未能读取或写入"文件名"中的某些数据(错误代码-36)】(实测,好用)
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13617027.html
Copyright © 2011-2022 走看看