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——远程过程调用