第02章-入门RabbitMQ核心概念
本章内容包括,RabbitMQ 的高性能之道是如何做到的?什么是 AMQP 高级协议?AMQP 核心概念是什么?RabbitMQ 整体架构模型是什么样子的?RabbitMQ 消息是如何流转的?RabbitMQ 安装与使用命令行与管控台,RabbitMQ 消息生产与消费,RabbitMQ 交换机详解,RabbitMQ 队列、绑定、虚拟主机、消息等...
# 一、RabbitMQ 高性能的原因
- Erlang 语言最初用于交换机领域的架构模式,这样使得 RabbitMQ 在 Broker 之间进行数据交互的性能是十分优秀的
- Erlang 的优点:Erlang 有着和原生 Socket 一样的延迟
# 二、AMQP 高级消息队列协议与模型
# 2.1 AMQP 定义
AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议)。
AMQP定义:AMQP 是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息对下列协议,是一个应用层协议的一个开放标准,为面向消息的中间件设计。
# 2.2 AMQP 协议模型
生产者(Publisher application)将消息投递到 Server 端,到达 Exchange 上。消费者(Consumer application)监听 Message Queue,拿到消息进行消费。
其中 Exchange 和 Message Queue 有一定的绑定关系。
# 2.3 AMQP 核心概念
- Server:又称 Broker,接受客户端的连接,实现 AMQP 实体服务。
- Connection:连接,应用程序与 Broker 的网络连接。
- Channel:网络信道,几乎所有的操作都在 Channel 中进行,Channel 是进行消息读写的通道。客户端可以建立多个 Channel,每个 Channel 代表一个会话任务。
- Message:消息,服务器和应用程序之间传送的数据,由 Properties 和 Body 组成。Properties 可以对消息进行修饰,比如消息的优先级、延迟等高级特征;Body 则就是消息的内容。
- Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个 Virtual host 里面可以有若干个 Exchange 和 Queue,同一个 Virtual host 里面不能有相同名称的 Exchange 和 Queue。
- Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列。
- Binding:Exchange 和 Queue 之间的虚拟连接,binding 中可以包含 routing key(路由键)。
- Routing key:一个路由规则,虚拟机可以用它来确定如何路由一个特定的消息。
- Queue:可称为 Message Queue,消息队列,保存消息并将它们转发给消费者。
# 2.4 RabbitMQ 整体架构与消息流转
RabbitMQ 整体架构
生产者值关注把消息投递到指定的 Exchange,消费者只需要监听指定的队列。Exchange 和 Queue 之间有一个绑定的关系。
RabbitMQ 消息流转图
生产者将 Message 投递到 Exchange 上,一个 Exchange 可以绑定多个 Message Queue,Exchange 根据路由 key,将消息路由到指定的队列上,消费者监听指定的队列,进行消息消费。
# 三、RabbitMQ 快速入门
# 3.1 消息生产与消费
- ConnectionFactory:获取连接工厂
- Connection:一个连接
- Channel:数据通信信道,可发送和接收消息
- Queue:具体的消息存储队列
- Producer & Consumer:生产者和消费者
# 四、Exchange 交换机详解
Exchange:接收消息,并根据路由键转发消息到所绑定的队列
# 4.1 Exchange 概念图解
- 蓝框:Send Message 过程,表示 Client 端将消息投递到 Exchange 上,通过路由关系路由到指定的队列
- 绿框:Receive Message 过程,表示 Client 跟队列建立的监听,去接收消息
- 红框:Rabbit Server
- 黄框:RoutingKey 和绑定关系,Exchange 和队列要建立绑定关系,消息到达 Exchange 后投递到哪个队列由 RoutingKey 决定
# 4.2 交换机属性
- Name:交换机名称
- Type:交换机类型 direct、topic、fanout、headers
- Durability:是否需要持久化,true 为持久化
- Auto Delete:当最后一个绑定到 Exchange 上的队列删除后,自动删除该 Exchange
- Internal:当前 Exchange 是否用于 RabbitMQ 内部使用,默认为 false
- Arguments:扩展参数,用于扩展 AMQP 协议自制定化使用
# 4.3 交换机类型
# 4.3.1 Direct Exchange
直连方式的 Exchange。
所有发送到 Direct Exchange 的消息被转发到 RoutingKey 中指定的 Queue。
注意:Direct 模式可以使用 RabbitMQ 自带的 Exchange:default Exchange,所以不需要将 Exchange 进行任何绑定(binding)操作,消息传递时,RoutingKey 必须完全匹配才会被队列接收,否则该消息会被抛弃。
# 4.3.2 Direct Exchange
所有发送到 Topic Exchange 的消息被转发到所有关心 RoutingKey 中指定 Topic 的 Queue 上
Exchange 将 RoutingKey 和某 Topic 进行模糊匹配,此时队列需要绑定一个 Topic。
注意:模糊匹配可以使用通配符
“#” 匹配一个或多个词 “*” 匹配不多不少一个词
如:"log.#" 能匹配到 "log.info.oa", "log.*" 只能匹配到 "log.err"
# 4.3.3 Fanout Exchange
不处理路由键,只需要简单地将队列绑定到交换机上;
发送到交换机的消息都会被转发到与交换机绑定的队列上;
Fanout 交换机转发消息是最快的。
# 五、绑定、队列、消息、虚拟主机详解
# 5.1 Binding - 绑定
- Exchange 和 Exchange、Queue 之间的连接关系
- Binding 中可以包含 RoutingKey 或者参数
# 5.2 Queue - 消息队列
消息队列,实际存储消息数据
- Durability:是否持久化,Durable:是,Transient:否
- Auto delete:如选 yes,代表当最后一个监听被移除之后,该 Queue 会自动被删除
# 5.3 Message - 消息
服务器和应用程序之间传送的数据
本质上就是一段数据,由 Properties 和 Payload(Body)组成
常用属性:delivery mode(持久化模式)、headers(自定义属性)
其他属性:
content_type、content_encoding、priority(优先级)
correlation_id(唯一id)、reply_to、expiration(过期时间)、message_id(消息id)
timestamp、type、user_id、app_id、cluster_id
# 5.4 Virtual host - 虚拟主机
虚拟地址,用于进行逻辑隔离,最上层的消息路由
一个 Virtual host 里面可以有若干个 Exchange 和 Queue
同一个 Virtual host 里面不能有相同名称的 Exchange 和 Queue