三、RabbitMQ 学习 - RabbitMQ 简介
hi,我是温新,一名 PHPer
版本:erlang-25.2.1、rabbitmq_server-3.11.9
系统版本:Rocky Linux 9.1
学习目标:了解什么是 RabbitMQ
本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!
什么是 RabbitMQ
**RabbitMQ 是一款开源的消息中间件, 基于 AMQP 协议实现消息队列。**它是由 erlang 语言编写,具有高可靠、易扩展、高可用及丰富功能的功能特性。支持多种语言,如 Java、PHP、Python 等。
为什么使用 RabbitMQ
- 开源、性能优秀、稳定性保障;
- 提供可靠的消息投递模式(confirm)、返回模式(return);
- 集群模式丰富,表达式配置,HA模式,镜像队列模型;
- 保证数据不丢失的前提做到高可靠性、可用性。
RabbitMQ 工作原理
- 1、Broker 表示 RabbitMQ 服务,每个 Broker 中至少有一个 Virtual host 虚拟主机;
- 2、每个 Virtual host 中有自己的 交换机、队列,交换机与队列通过 Binding;
- 3、Producer 和 Consumer 通过 Connection 来保持连接,然后在 Connection 的基础上建立若干 Channel 信道,用来发送和接收消息;
- 4、Connection 和 Channel 属于一对多关系。
1、Connection 连接 每个 Producer 或 Consumer 要通过 RabbitMQ 发送与消费消息时,第一步就是要与 RabbitMQ 建立连接,而这个连接就是 Connection 且是一个长连接。
2、Channel 信道
Chnanel 是在 Connection 的基础上建立的虚拟连接,RabbitMQ 中大部分的操作都是使用 Channel 完成的。
3、Virtual Host 虚拟主机
一个 Broker 可以有多个虚拟主机,每个虚拟主机中都有自己的交换机和队列,同一个虚拟主机中的交换机和队列不能重名。
4、Queue 队列
Queue 用来存放消息队列,生产者发送的消息会被放在 Queue 中,而消费从 Queue 中取走生产者的消息。
5、Exchange 交换机
交换机负责根据不同的分发规则将消息分发到不同的 Queue 中,以供订阅了相关 Queue 的消费者使用消息。
RabbitMQ 核心概念
RabbitMQ 的核心概念主要有:
- 生产者(Producer):发送消息的应用;
- 消费者(Consumer):接收消息的应用;
- 队列(Queue):存储消息的缓存;
- 信道(Chnanel):连接中的一个虚拟通道;
- 交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息队列;
- 连接(Connection):连接 RabbitMQ 和应用服务器的 TCP 连接;
- 路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到队列的一个键;
- 绑定(Binding):绑定是队列和交换机的一个关联连接;
- 虚拟主机(Virtual Host):消息队列服务器实体。
交换机的类型
交换机共有五种类型:直连交换机(Direct Exchange)、扇形交换机(Fanout Exchange)、主题交换机(Topic Exchange)、头交换机(Headers Exchange)、默认交换机(Default Exchange)。
RabbitMQ 五种消息发送模式
RabbitMQ 包括五种队列模式,简单队列、工作队列、发布/订阅、路由、主题、rpc等。
简单队列
该模式是个一对一模式,只有一个生产者(用于生产消息),一个队列 Queue(用于存储消息),一个消费者 C (用于接收消息)。
工作模式
该模式是一个一对多模式,只一个生产者,一个用户存储消息的队列,多个消息者。
发布/订阅
该模式需要使用到交换机。
生产者将消息先发送到交换机上,然后交换机绑定到多个队列,这样每个发送到 fanout 类型的交换机的消息都会被分发到所有队列中,最后被监听该队列的消费者所使用。
路由模式
生产者将消息发送到 direct 交换器,同时生产者在发送消息的时候会指定一个路由 key,而在绑定队列和交换器的时候又会指定一个路由 key,那么消息只会发送到相应 routing key 相同的队列,然后由监听该队列的消费者进行消费消息。
路由模式(Routing)的特点:
- 该模式的交换机为direct,意思为定向发送,精准匹配。
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个
RoutingKey
(路由key) - 消息的发送方在 向 Exchange发送消息时,也必须指定消息的
RoutingKey
。 - Exchange 不再把消息交给每一个绑定的队列,而是根据消息的
RoutingKey
进行判断,只有队列的Routingkey
与消息的Routing key
完全一致,才会接收到消息。
主题模式
1、路由键与某个模式进行匹配,此时,队列需要绑定到一个模式上;
2、
#
号匹配一个或多个;3、
*
将路由键和某模式进行匹配。此时,队列需要绑定到一个模式上。
符号“#”匹配一个或多个词,“*”匹配不多不少一个词。
绑定队列到交换机指定key时,进行通配符模式匹配。