RabbitMQ入门

Published on:
Tags: 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#

User

用户Tags,即是用户角色,不同角色拥有不同的权限。

Management(普通管理者):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

Policymaker(策略制定者):可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息。

Monitoring(监控者):可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)。

Administrator(超级管理员):可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

用户创建成功后,退出当前用户,使用刚创建的用户登陆。

Add a new virtual host#

vhost

Vhost创建成功后,点击Vhost进入管理面板,展开 Permissions 一栏,可以看到当前用户已经在权限列表里了。
表示用户连接到RabbitMQ后,有权限向Exchange转发消息,或者消费Queue里的消息。

客户端连接到RabbitMQ,需要指定使用什么账户登陆、连接到哪一个Vhost,所以需要保证用户有权限操作指定Vhost。

如果需要为其他的用户赋予权限,则通过 Set permission 动作完成。

Add a new exchange#

exchange

Add a new queue#

queue

以上 交换机(Exchange) 和 队列(Queue) 必须同属于同一个 Vhost。

Bindings#

binding

队列必须绑定到一个交换机上,并且指定一个路由键(Routing key)。

Publish message#

sen

消息首先到达交换机,交换机根据路由键按照路由算法,把消息路由给指定的队列。
因此,测试需要从交换机发送消息。

使用队列里的发送消息功能,消息会被以队列名为路由键发送到相同虚拟机下的默认的交换机。

默认交换机隐性的绑定到每一个队列,默认交换机接收到消息后,使用队列名作为路由键,发送到队列,所以消息实际上又从交换机转发到队列。

Get messages#

rec

消息应答模式(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协议学习