RabbitMQ 是一个由 erlang 开发的基于 AMQP(Advanced Message Queue)协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀,是当前最主流的消息中间件之一。RabbitMQ 官网:http://www.rabbitmq.com
AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,同样,消息使用者也不用知道发送者的存在。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
消息队列的使用过程大概如下:
如上图所示:AMQP 里主要说两个组件,Exchange 和 Queue。绿色的X就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型。
RabbitMQ 是建立在强大的 Erlang OTP 平台上,因此安装 RabbitMQ 之前要先安装 Erlang.
(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_user bdyh bdyh@2017
(4)设置管理员
输入:
rabbitmqctl.bat set_user_tags bdyh administrator
(5)设置权限
输入:
rabbitmqctl.bat set_permissions -p / bdyh ".*" ".*" ".*"
(6)其它命令
以上这些,账号、vhost、权限、作用域等基本就设置完啦!
使用浏览器打开http://localhost:15672 访问 RabbitMQ 的管理控制台,使用刚才创建的账号登陆系统即可。RabbitMQ 管理后台,可以更好的可视化方式查看 RabbitMQ 服务器实例的状态。
RabbitMQ.Client 是 RabbitMQ 官方提供的的客户端,net 版本地址 为:http://www.rabbitmq.com/dotnet.html
EasyNetQ 是基于 RabbitMQ.Client 基础上封装的开源客户端,使用非常方便,地址为:http://easynetq.com/
AMQP 协议中的核心思想就是:生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由 Exchange 来接收,然后 Exchange 按照特定的策略转发到 Queue 进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。
RabbitMQ 提供了四种 Exchange 模式:fanout、direct、topic、header.
所有发送到 Fanout Exchange 的消息都会被转发到与该 Exchange 绑定(Binding)的所有 Queue 上。
Fanout Exchange 不需要处理 RouteKey,只需要简单的将队列绑定到 exchange 上,这样发送到 exchange 的消息都会被转发到与该交换机绑定的所有队列上。类似子网广播,每台子网内的主机都获得了一份复制的消息。
所以,Fanout Exchange 转发消息是最快的。
所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue.
Direct 模式可以使用 RabbitMQ 自带的 Exchange:default Exchange ,因此不需要将 Exchange 进行任何绑定(binding)操作 。消息传递时,RouteKey 必须完全匹配,才会被队列接收,否则该消息会被抛弃。
所有发送到 Topic Exchange 的消息被转发到所有关心 RouteKey 中指定 Topic 的 Queue 上,Exchange 将 RouteKey 和某 Topic 进行模糊匹配。此时队列需要绑定一个 Topic,可以使用通配符进行模糊匹配,符号#匹配一个或多个词,符号匹配不多不少一个词。因此log.#能够匹配到log.info.oa,但是log. 只会匹配到log.error.
所以,Topic Exchange 使用非常灵活。