RabbitMQ概述
简介
MQ 本质上就是一个队列,MQ (Message Queue)是消息队列,可以存放各式各样的消息,如:字符串、JSON、内嵌对象等等
MQ 在市面上右很多产品:如 Kafka (常用于日志的采集)
RocketMQ(采用Java语言开发,由阿里巴巴开源)
RabbitMQ(采用 Erlang 语言开发)
在本专栏里主要介绍RabbitMQ
RabbitMQ 的官网地址:https://www.rabbitmq.com/
核心概念
Producer 表示生产者,是RabbitMQ 的客户端,用于发送消息
Consumer 表示消费者,是RabbitMQ 的客户端,用户接收消息
Broker 表示 RabbitMQ Server,主要用于接收和发送消息
Connection : 连接,是客户端和RabbitMQ 的一个TCP 连接,这个连接是建立在消息传递的基础上,负责客户端和服务器之间所有的数据和控制信息
Channel:通道,信道,Channel 是 Connection 之上的一个抽象层,在RabbitMQ,一个TCP 连接可以由多个Channel ,每个 Channel 都是独立的虚拟连接,消息的发送和接收都是基于Channel 的
通道的主要作用就是将消息的读写操作复用在同一个TCP 连接上,这样就可以减少和关闭连接的开销了,提高性能。
Virtual host :虚拟主机,一个BrokerServer 上可以存在多个虚拟主机,这个可以类比MySQL数据库里面可以创建出多个数据库。
Queue: 队列,是RabbitMQ 的内部对象,用于存储消息:
多个消费者可以订阅同一个队列,同理,多个生产者也可以向同一个队列发送消息
Exchange :交换机,当 message 到达 broker 的第一站的时候,Exchange 负责接收生产者发送的消息,并根据特定的规则把这些消息路由到一个或多个Queue 中
Exchange 起到了消息路由的作用,它根据类型和规则来确定如何转发接收消息
下面的是RabbitMQ的工作流程图,RabbitMQ 是基于生产者消费者模型开发的,负责接收、存储和转发消息
- Producer 生产了⼀条消息
- Producer 连接到RabbitMQBroker, 建立⼀个连接(Connection), 开启⼀个信道(Channel)
- Producer 声明⼀个交换机(Exchange), 路由消息
- Producer 声明⼀个队列(Queue), 存放信息
- Producer 发送消息到abbitMQ Broker
- RabbitMQ Broker 接收消息, 并存入相应的队列(Queue)中, 如果未找到相应的队列, 则根据生产者的配置, 选择丢弃或者退回给生产者.
AMQP
AMQP(Advanced Message Queuing Protocol)是⼀种⾼级消息队列协议, AMQP定义了⼀套确定的消息交换功能, 包括交换器(Exchange), 队列(Queue)等. 这些组件共同⼯作, 使得⽣产者能够将消息发送到交换器. 然后由队列接收并等待消费者接收. AMQP还定义了⼀个网络协议, 允许客户端应用通过该协议与消息代理和AMQP模型进行交互通信
RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang的实现(当然RabbitMQ还支持STOMP2, MQTT2等协议). AMQP的模型结构和RabbitMQ的模型结构是⼀样的.