RabbitMQ入门
RabbitMQ简介#
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅),可靠、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
安装RabbitMQ#
rabbitmq 的安装参考 windows10环境下的RabbitMQ安装步骤(图文)
手动收发消息#
RabbitMQ安装好后,接着测试收发消息。
Add a user#
用户Tags,即是用户角色,不同角色拥有不同的权限。
Management(普通管理者):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
Policymaker(策略制定者):可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息。
Monitoring(监控者):可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)。
Administrator(超级管理员):可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
用户创建成功后,退出当前用户,使用刚创建的用户登陆。
Add a new virtual host#
Vhost创建成功后,点击Vhost进入管理面板,展开 Permissions 一栏,可以看到当前用户已经在权限列表里了。
表示用户连接到RabbitMQ后,有权限向Exchange转发消息,或者消费Queue里的消息。
客户端连接到RabbitMQ,需要指定使用什么账户登陆、连接到哪一个Vhost,所以需要保证用户有权限操作指定Vhost。
如果需要为其他的用户赋予权限,则通过 Set permission 动作完成。
Add a new exchange#
Add a new queue#
以上 交换机(Exchange) 和 队列(Queue) 必须同属于同一个 Vhost。
Bindings#
队列必须绑定到一个交换机上,并且指定一个路由键(Routing key)。
Publish message#
消息首先到达交换机,交换机根据路由键按照路由算法,把消息路由给指定的队列。
因此,测试需要从交换机发送消息。
使用队列里的发送消息功能,消息会被以队列名为路由键发送到相同虚拟机下的默认的交换机。
默认交换机隐性的绑定到每一个队列,默认交换机接收到消息后,使用队列名作为路由键,发送到队列,所以消息实际上又从交换机转发到队列。
Get messages#
消息应答模式(Ack Mode)可以选择 Ack message 或者Nack message。
Ack(acknowledgement)模式表示消费者接收到消息,rabbitMQ可以删除消息了,Nack(not acknowledgement)模式表示消费者接收到消息,但是rabbitMQ依然缓存消息。
系统架构#
RabbitMQ系统最核心的组件是交换机(Exchange)和队列(Queue),下图是系统简单的示意图。交换机和队列是在rabbitmq server(又叫做broker)端,生产者(producer)和消费者(consumer)在应用端。
RabbitMQ系统可以创建多个虚拟主机(Virtual host),提供给不同的用户使用。用户在自己的虚拟主机里创建交换机和队列,实现消息队列功能。因此虚拟主机在逻辑上隔离了不同用户的消息。
生产者&消费者#
producer指的是消息生产者,consumer消息的消费者。
队列#
消息队列,提供FIFO的处理机制,交换机转发消息入队,消费者消费消息出队。
队列存储消息的地方,因此队列具有缓存消息的能力,缓存方式有:
- 持久化(Durable): 消息会在服务端本地硬盘存储一份,防止系统崩溃,数据丢失
- 临时(Transient): 数据在系统重启之后就会丢失
交换机#
交换机提供消息的路由策略。
消息由生产者提供,生产者通过信道把消息转发给交换机,交换机具有与队列一样的缓存消息的功能。
一个交换机可与多个队列绑定,交换机根据路由键按照路由算法,把消息路由给不同的队列。
交换机的路由策略与交换机的类型和路由键有关,交换机有4种类型:Direct、fanout、topic、headers。
- Direct: 交换机将消息转发给与路由缉拿完成一样的队列
- fanout: 忽略路由键,交换机把消息转发给所有绑定的队列
- topic: 以路由键为模式,交换机将消息转发给与模式匹配的队列
- headers: 消息体的header匹配
绑定#
把交换机和队列绑定在一起,并且付带一个路由键。一个交换机可以绑定多个队列。
交换机除了可以绑定队列,还可以绑定交换机,同样需要付带一个路由键
虚拟主机#
一个RabbitMQ系统可以有多个虚拟主机,每个虚拟主机管理各自的交换机、队列和绑定。
虚拟主机在逻辑上分离数据,使得不同应用的数据安全运行,互不干扰。
生产者和消费者连接RabbitMQ系统需要指定一个虚拟主机。
通信过程#
- 消费者与RabbitMQ系统取得连接,并且订阅了一个指定队列
- 生产者与RabbitMQ系统取得连接
- 生产者通过信道(Channel)把消息(message)发送给交换机,并且提供一个路由键(Routing key)
- 交换机根据路由键按照路由算法,把消息路由给指定的队列
- 队列收到消息后,会把消息发送给消费者
- 消费者收到消息后,发送ACK命令给队列,表示确认
- 队列收到ACK命令后,从队列中删除此条消息
参考#
[1] Rabbitmq基本原理
[2] AMQP协议学习