Version: Next

RabbitMQ 引言

什么是 MQ

MQ Message Queue:即 消息队列,基于典型的 生产者消费者 模型

  • 生产者不断向消息队列中生产消息;消费者不断从队列中获取消息
  • 消息的生产和消费都是异步的,只关心消息的发送和接收,没有业务逻辑的入侵,轻松实现系统间解耦
  • 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成
  • 别名 消息中间件

不同 MQ 的特点

  • 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 中的消息

构建步骤

  1. 构建一个 虚拟主机 Virtual Host
  2. 虚拟主机 绑定 用户
    1. 连接到 Server
    2. 连接到 Virtual Host
    3. 通过 账户 ,才能将 消息 发送给指定的 交换机 (或 队列
  3. 消费者从 队列 消费消息,消费者也需要连接到 Server 及对应的 虚拟主机

消息模型

  1. Hello World——点对点
  2. Work Queues——类似轮询
  3. Publish/Subscribe——发布/订阅模型
  4. Routing——路由
  5. Topics——类似 动态路由
  6. RPC——远程过程调用