Version: Next
RabbitMQ 引言
什么是 MQ
MQ Message Queue
:即 消息队列
,基于典型的 生产者
和 消费者
模型
- 生产者不断向消息队列中生产消息;消费者不断从队列中获取消息
- 消息的生产和消费都是异步的,只关心消息的发送和接收,没有业务逻辑的入侵,轻松实现系统间解耦
- 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成
- 别名
消息中间件
不同 MQ 的特点
- ActiveMq
- Kafka
- RocketMQ
- RabbitMQ
- ActiveMq 是 Apache 出品的,最流行的,能力强劲的开源消息总线
- 是一个完全支持JMS规范的消息中间件
- API丰富,多种集群架构模式让 ActiveMQ 在业界称为老牌的消息中间件
RabbitMq 比 Kafka 可靠,Kafka 更适合 IO 高吞吐的处理,一般应用在大数据日志处理或对实时性、可靠性要求稍低的场景使用
AMQP 协议
问题
为什么不直接使用 HTTP 协议
- HTTP 报文请求头和响应报文体比较复杂,包含了 cookie,数据的加密解密,状态码,响应码等附件的功能,对于一个消息来说不需要这么复杂,而是追求数据传递、存储、分发的高性能、简洁、快速
- 大部分情况下 HTTP 是短连接,在实际交互中,一个请求到响应很可能中断,中断后就不会进行持久化,从而造成请求丢失,不利于消息中间件业务场景。因为,消息中间件可能是一个长期的获取消息的过程,出现问题和故障都要对数据或消息进行持久化,目的是保证消息、数据的高可靠
AMQP
—— Advanced Message Queuing Protocol 高级消息队列协议
- 由摩根大通集团联合其他公司共同设计
- 提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
- 基于此协议的客户端与消息中间件可传递消息,不受不同产品、不同语言的限制。
RabbitMQ
基于Erlang
语言实现特点:
- 支持分布式事务
- 支持消息持久化
- 高性能、高可靠消息处理
生产者
与消费者
完全解耦
生产者
只管生产,不管消费者
消费了没消费者
只管消费,不管生产者
的生产状况生产者
生产者
与Server
建立连接,使用通道 Channel
传递消息- 每一个
生产者
对应一个虚拟主机 Virtual Host
(类似于 MySQL 中的库 DataBase
)- 通过
账户
可以访问虚拟主机,Guest
账户可以访问所有虚拟主机;实际开发中,通常只允许一个账户访问一个虚拟主机生产者
通过账户
连接上虚拟主机
,通过通道
把消息
放到交换机 Exchange
里,交换机
可以与队列 Queue
交互 (也可以不用交换机,直接把消息放到队列里),这些区分取决于采用的消息模型
消费者
- 只关心
队列 Queue
中的消息构建步骤
- 构建一个
虚拟主机 Virtual Host
- 给
虚拟主机
绑定用户
- 连接到
Server
- 连接到
Virtual Host
- 通过
账户
,才能将消息
发送给指定的交换机
(或队列
)- 消费者从
队列
消费消息,消费者也需要连接到 Server 及对应的 虚拟主机
消息模型
Hello World
——点对点Work Queues
——类似轮询Publish/Subscribe
——发布/订阅模型Routing
——路由Topics
——类似动态路由
RPC
——远程过程调用