RabbitMQ 入门教程之一
相关站点
RabbitMQ 基础概念
AMQP(Advanced Message Queuing Protocol)高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布 / 订阅)、可靠性、安全。RabbitMQ 是一个开源的 AMQP 标准实现,服务器端用 Erlang 语言编写,支持多种客户端,如:Python、Ruby、C#、Java、PHP、GO、JavaScript 等。RabbitMQ 用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等方面表现不俗。
RabbitMQ 的用户角色分类
- 超级管理员 (administrator),可登陆管理控制台,可查看所有的信息,并且可以对用户,策略 (policy) 进行操作
- 监控者 (monitoring),可登陆管理控制台,同时可以查看 rabbitmq 节点的相关信息 (进程数,内存使用情况,磁盘使用情况等)
- 策略制定者 (policymaker),可登陆管理控制台,同时可以对 policy 进行管理。但无法查看节点的相关信息,与 administrator 的对比,administrator 能看到节点信息
- 普通管理者 (management),仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理
- 其他,无法登陆管理控制台,通常就是普通的生产者和消费者
RabbitMQ 用户与角色管理
1 | # 创建超级管理员用户 |
RabbitMQ 虚拟主机管理
对 RabbitMQ 的用户角色权限进行管理时,可以将 RabbitMQ 理解为普通的数据库,其中 VHostPath 可以类比为数据库名,用户角色权限则是对指定数据库的限制访问。
1 | # 创建虚拟主机 |
RabbitMQ 用户权限管理
用户权限指的是用户对其所能访问的 VHostPath 的 exchange,queue 的操作权限,包括配置权限,读写权限。配置权限会影响到 exchange,queue 的声明和删除;读写权限影响到从 queue 里取消息,向 exchange 发送消息以及 queue 和 exchange 的绑定 (bind) 操作。例如: 将 queue 绑定到某 exchange 上,需要具有 queue 的可写权限,以及 exchange 的可读权限;向 exchange 发送消息需要具有 exchange 的可写权限;从 queue 里取数据需要具有 queue 的可读权限。详细请参考官方文档中 “How permissions work” 部分。
1 | # 赋予用户权限 |
RabbitMQ 常用命令
1 | # 列出所有队列 |
RabbitMQ Simple Queue 模式(简单队列)
简单队列模式下,每条消息只会被一个消费者所接收,不存在多个消费者接收到同一条消息的情况,而且不管有多少个消费者,默认情况下服务端都会以轮询分发(round-robin)的方式确保每个消费者接收到的消息数量是一样的。
RabbitMQ Work Queue 模式(工作队列)
工作队列模式下,每条消息只会被一个消费者所接收,不存在多个消费者接收到同一条消息的情况;同时工作队列模式可以使用公平分发(fair dispatch)的方式来发送消息,特点是处理能力强的消费者可以接收到更多的消息(能者多劳),这也是与简单队列模式相比较不同的地方。当使用公平分发时,消费者可调用 basicQos()方法,同时需要手动确认消息(ACK 机制)。
RabbitMQ Fanout 模式(发布 / 订阅)
单个生产者可以对应多个消费者,每个消费者都有自己的队列,同一条消息可以被多个消费者接收。所有发送到 Fanout Exchange 的消息都会被转发到与该 Exchange 绑定 (Binding) 的所有 Queue 上。Fanout Exchange 不需要额外处理 RouteKey,只需要简单地将队列绑定到 Exchange 上,这样发送到 Exchange 的消息都会被转发到与该交换机绑定的所有队列上,作用类似子网广播,每台子网内的主机都获得了一份复制的消息,因此 Fanout Exchange 转发消息是最快的。
RabbitMQ Direct 模式(路由)
单个生产者可以对应多个消费者,每个消费者都有自己的队列,同一条消息可以被多个消费者接收。所有发送到 Direct Exchange 的消息会被转发到 RouteKey 中指定的 Queue 上。消息传递时,RouteKey 必须完全匹配,才会被队列接收,否则该消息会被抛弃。
RabbitMQ Topic 模式(通配符)
单个生产者可以对应多个消费者,每个消费者都有自己的队列,同一条消息可以被多个消费者接收。所有发送到 Topic Exchange 的消息会被转发到指定 Topic 的 Queue 上,Exchange 会将 RouteKey 和某个 Topic 进行模糊匹配,此时队列需要绑定一个 Topic。RouteKey 可以使用通配符进行模糊匹配,符号 #
表示匹配一个或多个词,符号 *
表示匹配不多不少一个词。因此 log.#
能够匹配到 log.info.oa
,但是 log.*
只会匹配到 log.error
,所以 Topic Exchange 的使用非常灵活。