RabbitMQ的⼯作流程:
RabbitMQ是⼀个消息中间件, 也是⼀个⽣产者消费者模型. 它负责接收, 存储并转发消息.
消息传递的过程类似邮局.
当你要发送⼀个邮件时,你把你的邮件放到邮局,邮局接收邮件, 并通过邮递员送到收件⼈的⼿上.
1、Producer: ⽣产者, 是RabbitMQ Server的客⼾端, 向RabbitMQ发送消息
2、Consumer: 消费者, 也是RabbitMQ Server的客⼾端, 从RabbitMQ接收消息
3、Broker:其实就是RabbitMQ Server, 主要是接收和收发消息
• ⽣产者(Producer)创建消息, 然后发布到RabbitMQ中. 在实际应⽤中, 消息通常是⼀个带有⼀定业务
逻辑结构的数据, ⽐如JSON字符串. 消息可以带有⼀定的标签, RabbitMQ会根据标签进⾏路由, 把消
息发送给感兴趣的消费者(Consumer).
• 消费者连接到RabbitMQ服务器, 就可以消费消息了, 消费的过程中, 标签会被丢掉. 消费者只会收到
消息, 并不知道消息的⽣产者是谁, 当然消费者也不需要知道.
• 对于RabbitMQ来说,⼀个RabbitMQ Broker可以简单地看作⼀个RabbitMQ服务节点, 或者
RabbitMQ服务实例. ⼤多数情况下也可以将⼀个RabbitMQ Broker看作⼀台RabbitMQ服务器
4、Connection: 连接. 是客⼾端和RabbitMQ服务器之间的⼀个TCP连接. 这个连接是建⽴消息传递的基础, 它负责传输客⼾端和服务器之间的所有数据和控制信息.
5、Channel: 通道, 信道. Channel是在Connection之上的⼀个抽象层. 在 RabbitMQ 中, ⼀个TCP连接可以有多个Channel, 每个Channel 都是独⽴的虚拟连接. 消息的发送和接收都是基于 Channel的.
通道的主要作⽤是将消息的读写操作复⽤到同⼀个TCP连接上,这样可以减少建⽴和关闭连接的开销,提⾼性能.
6、Virtual host: 虚拟主机. 这是⼀个虚拟概念. 它为消息队列提供了⼀种逻辑上的隔离机制. 对于
RabbitMQ⽽⾔, ⼀个 BrokerServer 上可以存在多个 Virtual Host. 当多个不同的⽤⼾使⽤同⼀个
RabbitMQ Server 提供的服务时,可以虚拟划分出多个 vhost,每个⽤⼾在⾃⼰的 vhost 创建
exchange/queue 等
7、Queue: 队列, 是RabbitMQ的内部对象, ⽤于存储消息.
多个消费者可以订阅同一个队列
Exchange: 交换机. message 到达 broker 的第⼀站, 它负责接收⽣产者发送的消息, 并根据特定的规则把这些消息路由到⼀个或多个Queue列中.
Exchange起到了消息路由的作⽤,它根据类型和规则来确定如何转发接收到的消息.
(类似于发快递之后, 物流公司怎么处理呢, 根据咱们的地址来分派这个快递到不同的站点, 然后再送到收件⼈⼿⾥. 这个分配的⼯作,就是交换机来做的)
RabbitMQ的工作流程:
-
Producer ⽣产了⼀条消息
-
Producer 连接到RabbitMQBroker, 建⽴⼀个连接(Connection),开启⼀个信道(Channel)
-
Producer 声明⼀个交换机(Exchange), 路由消息
-
Producer 声明⼀个队列(Queue), 存放信息
-
Producer 发送消息⾄RabbitMQ Broker
-
RabbitMQ Broker 接收消息, 并存⼊相应的队列(Queue)中, 如果未找到相应的队列, 则根据⽣产者的配置, 选择丢弃或者退回给⽣产者.
如果我们把RabbitMQ⽐作⼀个物流公司,那么它的⼀些核⼼概念可以这样理解:
-
Broker就类似整个物流公司的总部, 它负责协调和管理所有的物流站点, 确保包裹安全、⾼效地送达.
-
Virtual Host可以看作是物流公司为不同的客⼾或业务部⻔划分的独⽴运营中⼼. 每个运营中⼼都
有⾃⼰的仓库(Queue), 分拣规则(Exchange)和运输路线(Connection和Channel), 这样可以确保
不同客⼾的包裹处理不会相互⼲扰, 同时提供定制化的服务
-
Exchange就像是站点⾥的分拣中⼼. 当包裹到达时, 分拣中⼼会根据包裹上的标签来决定这个包裹应该送往哪个⽬的地(队列). 快递站点可能有不同类型的分拣中⼼, 有的按照具体地址分拣, 有的将包裹复制给多个收件⼈等.
-
Queue就是快递站点⾥的⼀个个仓库, ⽤来临时存放等待派送的包裹. 每个仓库都有⼀个或多个快递员(消费者)负责从仓库中取出包裹并派送给最终的收件⼈.
-
Connection就像是快递员与快递站点之间的通信线路. 快递员需要通过这个线路来接收派送任务
(消息).
- Channel就像是快递员在执⾏任务时使⽤的多个并⾏的通信线路. 这样,快递员可以同时处理多个包裹, ⽐如⼀边派送包裹, ⼀边接收新的包裹
AMQP(Advanced Message Queuing Protocol)是⼀种⾼级消息队列协议, AMQP定义了⼀套确定的消息交换功能, 包括交换器(Exchange), 队列(Queue) 等. 这些组件共同⼯作, 使得⽣产者能够将消息发送到交换器. 然后由队列接收并等待消费者接收. AMQP还定义了⼀个⽹络协议, 允许客⼾端应⽤通过该协议与消息代理和AMQP模型进⾏交互通信
RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang的实现(当RabbitMQ还⽀持STOMP2, MQTT2等协议). AMQP的模型结构和RabbitMQ的模型结构是⼀样的.
为什么选择RabbitMQ?
有很多的MQ产品, 例如RabbitMQ, RocketMQ, ActiveMQ, Kafka, ZeroMQ等, 也有直接使⽤
Redis充当消息队列的案例, 这些消息队列, 各有侧重, 也没有好坏, 只有适合不适合, 在实际选型时, 需要结合⾃⾝需求以及MQ产品特征, 综合考虑。
- Kafka
Kafka⼀开始的⽬的就是⽤于⽇志收集和传输,追求⾼吞吐量, 性能卓越, 单机吞吐达到⼗万级, ⽇志领域⽐较成熟, 功能较为简单,主要⽀持简单的 MQ 功能, 如果有⽇志采集需求,肯定是⾸kafka了。
- RocketMQ
RocketMQ采⽤Java语⾔开发, 由阿⾥巴巴开源, 后捐赠给了Apache.它在设计时借鉴了Kafka,做出了⼀些⾃⼰的改进, ⻘出于蓝⽽胜于蓝, 经过多年双⼗⼀的洗礼, 在可⽤性、可靠性以及稳定性⽅⾯都有出⾊的表现. 适合对于可靠性⽐较⾼,且并发⽐较⼤的场景, ⽐如互联⽹⾦融. 但⽀持的客⼾端语⾔不多, 且社区活跃度⼀般
- RabbitMQ
采⽤Erlang语⾔开发, MQ 功能⽐较完备, 且⼏乎⽀持所有主流语⾔,开源提供的界⾯也⾮常友好,性能较好, 吞吐量能达到万级, 社区活跃度也⽐较⾼,⽐较适合中⼩型公司, 数据量没那么⼤, 且发没那么⾼的场景.
综合: 由于RabbitMQ的综合能⼒较强, 咱们这边的项⽬没有那么⼤的⾼并发, 且RabbitMQ社区⽐较成熟, 管理界⾯友好, 所以咱们接下来主要学习RabbitMQ的使⽤