RabbitMQ高级使用指南

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

RabbitMQ高级使用指南
一、RabbitMQ简介
1、介绍
RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现。

用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。

是当前最主流的消息中间件之一。

RabbitMQ官网:
2、AMQP
AMQP是应用层协议的一个开放标准,为面向消息的中间件设计。

消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,同样,消息使用者也不用知道发送者的存在。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

3、系统架构
key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

如上图所示:AMQP里主要说两个组件:Exchange和Queue。

绿色的X就是Exchange ,红色的是Queue ,这两者都在Server端,又称作Broker,这部分是RabbitMQ实现的,而蓝色的则是客户端,通常有Producer和Consumer两种类型。

4、几个概念
∙P:为Producer,数据的发送方。

∙C:为Consumer,数据的接收方。

∙Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

∙Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

∙Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

∙Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

∙vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

∙channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

二、RabbitMQ安装与配置
1、安装
RabbitMQ是建立在强大的Erlang OTP平台上,因此安装RabbitMQ之前要先安装Erlang。

erlang:/download.html
RabbitMQ:/download.html
注意:
∙现在先别装最新的3.6.3 ,本人在安装完最新的版本,queue 队列有问题,降到了3.6.2 就解决了。

∙默认安装的RabbitMQ监听端口是:5672
2、配置
(1)安装完以后erlang需要手动设置ERLANG_HOME 的系统变量。

输入:set ERLANG_HOME=C:\Program Files\erl8.0
(2)激活RabbitMQ's Management Plugin
使用Rabbit MQ 管理插件,可以更好的可视化方式查看Rabbit MQ 服务器实例的状态,你可以在命令行中使用下面的命令激活。

输入:rabbitmq-plugins.bat enable rabbitmq_management
同时,我们也使用rabbitmqctl控制台命令(位于rabbitmq_server-3.6.3\sbin>)来创建用户、密码、绑定权限等。

(3)创建管理用户
输入:rabbitmqctl.bat add_userzhangweizhong weizhong1988
(4)设置管理员
输入:rabbitmqctl.bat set_user_tagszhangweizhong administrator
(5)设置权限
输入:rabbitmqctl.bat set_permissions -p / zhangweizhong ".*" ".*" ".*"
(6)其它命令
∙查询用户:rabbitmqctl.bat list_users
∙查询vhosts:rabbitmqctl.bat list_vhosts
∙启动RabbitMQ服务: net stop RabbitMQ&& net start RabbitMQ
4、创建vhosts
创建vhosts,在admin页面,点击右侧Virtual Hosts:
将刚创建的OrderQueue分配给相关用户。

EasyNetQ 是基于RabbitMQ.Client 基础上封装的开源客户端。

使用非常方便。

地址:
/ 。

本篇使用示例代码下载地址:
demo示例下载(/files/zhangweizhong/Weiz.RabbitMQ.RPC.rar)
RabbitMQ 还有很多其它客户端API,都非常好用。

我们一直用的都是EasyNetQ,所以这里的demo 只介绍EasyNetQ客户端实现。

2、项目结构
∙通过nuget安装项目EasyNetQ 相关组件(略)
∙增加BusBuilder.cs管道创建类,主要负责链接RabbitMQ。

∙增加IProcessMessage类,定义了一个消息方法,用于消息传递
增加Message类,定义了消息传递的实体属性字段等信息
增加MQHelper类,用于正在的订阅和发布消息。

(2)RabbitMQ由Producer(生成者)创建一个aspx 页面,增加如下代码:
(3)Weiz.Consumer 就是Consumer(消费者)∙新增OrderProcessMessage.cs
∙Program 增加如下代码:
4、运行
(1)启动 Weiz.Consumer (消费者),启动消费者,会自动在RabbitMQ 服务器上创建相关的exchange 和queue 。

Consumer 消费者,使用的是Subscribe (订阅)的模式,所以,Weiz.Consumer客户端启动后,会自动创建connection,生成相关的exchange 和queue。

(2)启动Weiz. Producer 里的TestMQ.aspx 页面,往队列里面写一条消息。

订阅的消费者立马就能拿到这条消息。

至此,C#向RabbitMQ消息队列发送消息已经简单完成。

四、几种Exchange模式
本节说些理论的东西——Exchange 的几种模式。

AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。

生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。

先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。

同理,消费者也是如此。

Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。

RabbitMQ提供了四种Exchange模式:fanout、direct、topic、header 。

header模式在实际使用中较少,本文只对前三种模式进行比较。

1、Fanout Exchange
所有发送到Fanout Exchange的消息都会被转发到与该Exchange 绑定(Binding)的所有Queue上。

Fanout Exchange 不需要处理RouteKey 。

只需要简单的将队列绑定到exchange 上。

这样发送到exchange的消息都会被转发到与该交换机绑定的所有队列上。

类似子网广播,每台子网内的主机都获得了一份复制的消息。

所以,Fanout Exchange 转发消息是最快的。

2、Direct Exchange
所有发送到Direct Exchange的消息被转发到RouteKey中指定的Queue。

Direct模式可以使用RabbitMQ自带的Exchange:default Exchange 。

所以不需要将Exchange进行任何绑定(binding)操作。

消息传递时,RouteKey必须完全匹配,才会被队列接收,否则该消息会被抛弃。

3、Topic Exchange
这个是RabbitMQ 的实际使用的几个场景,熟悉了这个,基本上RabbitMQ也就了解了。

/tutorials/tutorial-one-dotnet.html
至此,RabbitMQ几种Exchange 模式已经介绍完了,实际使用过程中,我们会根据不同的场景,来使用不同的exchange模式。

五、RPC 远程过程调用
最近有朋友问我,RabbitMQ RPC 是干嘛的、有什么用。

其实,RabbitMQ RPC就是通过消息队列(Message Queue)来实现RPC的功能,就是客户端向服务端发送定义好的Queue消息,其中携带的消息就应该是服务端将要调用的方法的参数,并使用Propertis告诉服务端将结果返回到指定的Queue。

1、RabbitMQ RPC的特点
∙Message Queue把所有的请求消息存储起来,然后处理,和客户端解耦。

∙Message Queue引入新的结点,系统的可靠性会受Message Queue结点的影响。

∙Message Queue是异步单向的消息。

发送消息设计成是不需要等待消息处理的完成。

所以对于有同步返回需求的,Message Queue是个不错的方向。

2、普通PRC的特点
∙同步调用,对于要等待返回结果/处理结果的场景,RPC是可以非常自然直觉的使用方式。

当然RPC也可以是异步调用。

∙由于等待结果,客户端会有线程消耗。

如果以异步RPC的方式使用,客户端线程消耗可以去掉。

但不能做到像消息一样暂存消息请求,压力会直接传导到服务端。

3、适用场合说明
∙希望同步得到结果的场合,RPC合适。

∙希望使用简单,则RPC;RPC操作基于接口,使用简单,使用方式模拟本地调用。

异步的方式编程比较复杂。

∙不希望客户端受限于服务端的速度等,可以使用Message Queue。

4、RabbitMQ RPC工作流程。

相关文档
最新文档