Skip to the content.

RabbitMQ

消息队列主要解决耦合, 异步处理, 流量削峰等问题

问题

几种消息队列的对比

RabbitMQ 的应用场景

  1. 非实时性: 不需要立即获得结果
  2. 应用耦合: 多应用间通过队列对同一任务进行处理, 避免一失败全失败
  3. 异步处理: 多应用对同一消息进行处理, 应用间并发处理消息.
  4. 限流削峰: 应用于秒杀或者抢购活动中, 避免流量过大导致应用挂掉的情况.
  5. 消息驱动的系统: 系统分为消息队列, 生产者, 消费者等.

对比 Kafka:

RabbitMQ: 遵循 AMQP 协议, 由内在高并发的 erlang 语言开发, 用在实时的对可靠性要求比较高的消息传递上 Kafka 主要用于处理活跃的流式数据, 大数据量的数据处理上

RabbitMQ 对比 Kafka

如果不用消息队列, 项目中会怎么实现对应功能?

开协程执行任务, 耦合度高

RabbitMQ 内部使用原理? 工作流程?

RabbitMQ 如何保证的数据可靠性?

RabbitMQ 中各种名词之间的关系

使用流程

  1. client 连接到消息队列服务器, 打开一个 channel
  2. client 声明一个 exchange, 并设置相关属性
  3. client 声明一个 queue, 并设置相关属性
  4. client 使用 routing key, 在 exchange 和 queue 之间建立好绑定关系
  5. client 投递消息到 exchange
  6. exchange 接收到消息后, 就根据消息 key 和已经设置的 binding, 进行消息路由, 将消息投递到一个或多个队列里.

什么是 AMQP 协议 (Advanced Message QueuingProtocol)

开放式标准应用层协议。

可以简单的理解为一套消息传递的标准协议, 例如 HTTP 协议, HTTPS 协议都有自身的规则.

整体上就是一个 生产->消费流程: 连接创建与销毁, 生产消息, 消费消息

为什么选择 RabbitMQ

  1. 除了 Qpid, RabbitMQ 是唯一一个实现了 AMQP 标砖的消息服务器
  2. 可靠性, RabbitMQ 的持久化支持, 保证了消息的稳定性
  3. 高并发, RabbitMQ 使用了 Erlang 开发语言, Erlang 是为电话交换机开发的语言, 天生自带高并发光环, 和高可用特性
  4. 集群部署简单
  5. 社区活跃度高

消息发送原理

首先应用程序和 Rabbit Server 之间会创建一个 TCP 连接, 一旦 TCP 打开, 并通过了认证, 认证就是你试图连接 Rabbit 之前发送的 Rabbit 服务器连接信息和用户名密码, 有点像程序连接数据. 一旦通过认证, 应用程序和 Rabbit Server 之间就创建了一条 AMQP 信道(channel).

信道是创建在真实 TCP 上的虚拟连接, AMQP 命令都是通过信道发送出去的, 每个信道都会有一个唯一的 ID, 不论是发布消息, 订阅队列或者介绍消息都是通过信道完成的.

为什么不直接通过 TCP 发送消息

对于操作系统来说创建和销毁 TCP 会话是非常昂贵的开销. 引入信道的概念, 我们可以在一条 TCP 连接上创建 N 多信道, 这样既能发送命令, 也能够保证每条信道的私密性, 我们可以想象成光纤电缆.

持久化原理

确保消息不丢失

RabbitMQ 集群