旧游无处不堪寻
无寻处,惟有少年心
RabbitMQ

本篇,我们介绍一下消息队列(MessageQueue)以及生产中比较常使用的框架 RabbitMQ。

什么是消息队列


消息队列允许应用程序通过相互发送消息进行通信。消息队列在目标程序繁忙或未连接时提供临时消息存储。

基本架构


消息队列的基本架构很简单: 客户机应用程序被称为生产者(producers),用于创建消息并将消息传递到消息队列。另一个应用程序称为消费者(consumer),它连接到队列并获取要处理的消息。放置到队列中的消息将被存储,直到使用者检索它们。

消息队列提供异步通信协议,该协议是一个将消息放入消息队列的系统,并且不需要对处理立即响应。这种处理消息的方式将生产者与消费者分离开来,因此它们不需要同时与消息队列进行交互。

优点


使用消息队列的优点主要有三个:解耦、异步、削峰。

解耦

解耦描述了系统的一个部分对另一个部分的依赖程度,当两个或多个系统能够在不连接的情况下通信,就可以实现解耦。
如果系统中的一个进程无法从队列中处理消息,其他消息仍可以被添加到队列中,并在系统恢复时进行处理。还可以使用消息队列来延迟处理消息。这种处理消息的方式便于创建了易维护和易扩展的系统。

异步

非必要的业务逻辑可以将消息写入消息队列以异步的方式运行,以加快响应速度。

削峰

在突发异常流量时,将消息写入消息队列,待流量恢复后,依次处理队列内消息,可以削峰平谷,防止服务器宕机。

RabbitMQ


RabbitMQ 是开源的面向消息的中间件,它实现了高级消息排队协议(AMQP)。

交换器(exchange)

消息不会直接发布到队列,通常生产者向交换器发送消息。交换器负责在 bindings 和 routing keys 的帮助下将消息路由到不同的队列。bindings 是队列和交换器之间的链接。

消息流

RabbitMQ 中的消息流:

  1. 首先指定交换器类型来创建交换器,然后生产者向创建的交换器发布消息
  2. 交换器接收消息并负责路由消息。交换器根据交换器类型考虑不同的消息属性,例如 routing keys
  3. 从交换器到队列方向创建 bindings
  4. 消息将一直留在队列中,直到被消费者处理
  5. 消费者处理消息

交换器类型

  1. Direct: 消息被路由到其绑定键与消息的路由键完全匹配的队列
  2. Fanout: 交换器将消息路由到绑定到它的所有队列
  3. Topic: Topic 交换在路由键和绑定中指定的路由模式之间进行通配符匹配

RabbitMQ 中的重要概念

  1. 生产者(Producer): 发送消息的应用程序
  2. 消费者(Consumer): 接收消息的应用程序
  3. 队列(Queue): 存储消息的缓冲区
  4. 消息(Message): 通过 RabbitMQ 从生产者发送到消费者的信息
  5. 连接(Connection): 应用程序和 RabbitMQ 代理之间的 TCP 连接
  6. 通道(Channel): 连接内部的虚拟连接。当发布或使用队列中的消息时,这一切都是通过通道完成的
  7. 交换器(Exchange): 接收来自生产者的消息,并根据交换器类型定义的规则将消息推送到队列。要接收消息,需要将队列绑定到至少一个交换器。
  8. 绑定(Binding): 绑定是队列和交换器之间的链接
  9. 路由键(Routing Key): 交换器用来决定如何将消息路由到队列的键。将路由键看作消息的地址
  10. 用户(User): 可以使用给定的用户名和密码连接到 RabbitMQ,可以为每个用户分配权限,例如在实例中读取、写入和配置特权的权限。还可以为用户分配特定虚拟主机的权限
  11. 虚拟主机(Vhost): 提供一种使用相同 RabbitMQ 实例隔离应用程序的方法。不同的用户可以对不同的 vhost 拥有不同的权限