文章目录
- RabbitMQ 工作流程
- 流程图
- Producer 和 Consumer
- Connecting 和 Channel
- Virtual host
- Queue
- Exchange
- RabbitMQ 工作流程
RabbitMQ 工作流程
流程图
RabbitMQ
就是一个生产者/消费者模型
Producer
就是生产者、Consumer
就是消费者Broker
是RabbitMQ
服务器- 生产者和消费者都是
RabbitMQ
服务器的客户端
生产者客户端需要通过 Connection
(连接)来和 RabbitMQ
服务器进行通信;RabbitMQ
服务器要通过 Connection
(连接)来和消费者客户端进行通信
- 一个
Connection
有多个channel
channel
就是消息传递的方式
Brocker
(RabbitMQ
服务器)
- 一个
Brocker
可以有多个虚拟主机(虚拟机) - 多个虚拟机之间是逻辑上的隔离,并不是物理上的隔离
- 每个虚拟机中,会有多个
Exchange
(交换机)和Queue
(队列)- 消息是先发送到交换机,然后由交换机进行消息的分发,然后到达队列
- 在
RabbitMQ
服务器收到消息的时候,会带上一些标签(消息要发到哪里等等) - 随后交换机拿到这个消息之后,会根据标签或者一些设置的信息,把这个消息路由到一个或者两个队列
- 如果没有匹配队列,交换机就会将此消息丢掉,或者返回给生产者
- 在
- 消息是先发送到交换机,然后由交换机进行消息的分发,然后到达队列
生产者和消费者使用的不是同一个 Connection
- 这个图上的
Connection
显示的是客户端的连接- 包含生产者和消费者的连接
Producer 和 Consumer
Producer
:生产者,是RabbitMQ Server
的客户端,向RabbitMQ
发送消息Consumer
:消费者,也是RabbitMQ Server
的客户端,从RabbitMQ
接收消息Brocker
:就是RabbitMQ Server
,主要是接收和收发消息
-
生产者根据一定的逻辑创建消息,然后把消息发送到
Brocker
里面,发送的这个消息通常是带有一定的业务逻辑结构的- 比如生产者是一个订单服务,那发送的就是订单相关信息
- 订单
id
- 订单金额
- 订单数量
- 支付时间
- …
- 订单
- 比如生产者是一个用户注册信息,那发送的就是用户相关信息
- 用户
id
- 用户年龄
- 用户性别
- …
- 用户
- 比如生产者是一个订单服务,那发送的就是订单相关信息
-
在生产者发送消息的时候,通常还会带上一些标签,
Brocker
在收到消息的时候,交换机会根据这些标签进行路由,最终把它放到队列里面
-
消费的时候,标签就会被丢掉。消费者只会收到消息,并不知道其他信息
- 消费者并不需要知道其他信息,只需要在收到消息之后,进行相应的逻辑处理即可
Connecting 和 Channel
Connection
:连接。是客户端和RabbitMQ
服务器之间的一个TCP
连接,这个连接是建立消息传递的基础,它负责传输客户端和服务器之间的所有数据和控制信息Channel
:通道,信道。Channel
是在Connection
之上的一个抽象层。在RabbitMQ
中,一个TCP
连接可以有多个Channel
,每个Channel
都是独立的虚拟连接,消息的发送和接收都是基于Channel
的
通道的主要作用是将消息的读写操作复用到一个 TCP
连接上,这样可以减少建立和关闭连接的开销,提高性能
Virtual host
Virtual host
:虚拟主机。这是一个虚拟概念,它为消息队列提供了一种逻辑上的隔离机制,对于RabbitMQ
而言,一个BrokerServer
上可以存在多个Virtual host
。当多个不同的用户使用同一个RabbitMQ Server
提供的服务时,可以虚拟划分出多个vhost
,每个用户在自己的vhost
创建exchange/queue
等
类似于
MySQL
的database
,是一个逻辑上的集合,一个MySQL
服务器可以有多个database
Queue
Queue
:队列。RabbitMQ
的内部对象,用于存储消息
消息经过一系列的转发
- 先通过
Channel
到达Exchange
- 然后通过
Exchange
到达Queue
- 最终存储的地方就是
Queue
队列和消费者的关系,是多对多的
- 一个队列,可以由多个消费者来订阅
- 一个消费者也可以订阅多个队列
Exchange
Exchange
:交换机。message
到达Brocker
的第一站,它负责接收生产者发送的消息,并根据特定的规则把这些消息路由到一个或多个Queue
中
- 消息可能会发给多个队列
- 可能发给一个队列
- 也可能没有队列
RabbitMQ 工作流程
Producer
生产了一条消息Producer
连接到RabbitMQ Brocker
,建立一个连接(Connection
),开启一个信道(Channel
)Producer
声明一个交换机(Exchange
),路由消息Producer
声明一个队列(Queue
),存放信息Producer
发送消息至RabbitMQ Brocker
RabbitMQ Brocker
接收消息,并存入相应的队列(Queue
)里面,如果未找到相应的队列,则根据生产者的配置,选择丢弃或者退回给生产者
如果我们把
RabbitMQ
比作一个物流公司,那么它的一些核心概念可以这样理解:
Brocker
就类似整个物流公司的总部,它负责协调和管理所有的物流站点,确保包裹安全、高效地送达Virtual Host
可以看做是物流公司为不同客户或业务部门划分的独立运营中心。每个运营中心都有自己的仓库(Queue
),分拣规则(Exchange
)和运输路线(Connection
和Channel
),这样可以确保不同客户的包裹处理不会相互干扰,同时提供定制化的服务Exchange
就像是站点里的分拣中心。当包裹到达时,分拣中心会根据包裹上的标签来决定这个包裹应该送往那个目的地(队列)。快递站点可能有不同类型的分拣中心,有的按照具体地址分拣,有的将包裹复制给多个收件人等Queue
就是快递站点里的一个个仓库,用来临时存放等待派送的包裹。每个仓库都有一个或多个快递员(消费者)负责从仓库中取出包裹并派送给最终的收件人Connection
就像是快递员与快递站点之间的通信线路,快递员需要通过这个线路来接收派送任务(消息)Channel
就像是快递员在执行任务时使用的多个并行的通信线路。这样,快递员可以同时处理多个包裹,比如一遍派送包裹,一边接收新的包裹