美文网首页
理解 RabbitMQ 工作流程

理解 RabbitMQ 工作流程

作者: SheHuan | 来源:发表于2021-05-24 21:14 被阅读0次

一、AMQP 协议

RabbitMQ 是基于 AMQP(Advanced Message Queue Protocol 高级消息队列协议)协议实现的消息队列中间件,协议的基本模型结构如下图:

从图中可以看出 AMQP 协议主要包含如下几个部分:

  • Producer,消息的生产者
  • Message,消息体
  • Connection,生产者或消费者与 RabbitMQ 服务建立的连接
    • Channel,数据通道,在 Connection 内部可以建立多个相互隔离的 Channel,每个 Channel 代表一个会话任务,消息的发送、接收登都是基于 Channel 实现的
  • Broker, 即 RabbitMQ 服务,完成消息的接收与分发
    • Virtual Host,虚拟主机,不同用户使用同一个 Broker 时,可以创建多个 Virtual Host 得到不同的隔离环境,主要包含如下几个部分
      • Exchange,消息交换机,消息先来到这里,然后按照指定的路由规则将消息投放到对应的消息队列中
      • Binding,将 Exchange 和 Queue 按照一定的路由规则绑定起来,一个 Exchange 可以和多个 Queue 绑定
      • Routing Key,路由关键字,Exchange 根据这个值决定将消息投放到那个队列
      • Queue,消息队列,经过 Exchange 的消息会被投放到这里,等待消费者消费
  • Consumer,消费者,消费队列中的消息

结合上边的内容,我们可以大致的描述出 RabbitMQ 的工作流程:生产者(Producer)与消费者(Consumer)和 RabbitMQ 服务(Broker)建立连接, 然后生产者发布消息(Message)同时需要携带交换机(Exchange) 名称以及路由规则(Routing Key),这样消息会到达指定的交换机,然后交换机根据路由规则匹配对应的 Binding,最终将消息发送到匹配的消息队列(Quene),最后 RabbitMQ 服务将队列中的消息投递给订阅了该队列的消费者(消费者也可以主动拉取消息)。

二、Exchange

前边我们已经了解到,一个 Exchange 可以绑定多个 Queue, Exchange 接收生产者发送的消息,然后将消息按照路由规则投放到指定的 Queue 中。接下来我们需要了解这个路由规则具体是什么样的,它是如何决定 Exchange 将消息发送到那个 Queue。

Binding 代表一个 Exchange 和一个 Queue 的绑定关系,这个绑定关系上可以附件一个参数 Routing Key,Exchange 会根据发送消息时携带的 Routing Key 去和该 Exchange 所有相关的 Binding 匹配,如果匹配到了,就将消息发送给 Binding 中绑定的 Queue。

上边是一个相对通用的流程,可以帮助我们理解交换机的工作原理,当然也存在一些特殊的情况后边会提到。

在 RabbitMQ 中,Exchange 主要分为: Fanout ExcahngeDirect ExchangeTopic ExchangeDefault ExchangeHeaders Exchange,同时 Routing Key 结合不同类型的 Exchange 使用时,用法也有所不同。

1、Fanout Exchange

Fanout 类型交换机原理图

使用 Fanout Exchange 时,会忽略 Routing Key,所以我们也就没必要在绑定 Exchange 和 Queue,以及发送消息时去设置 Routing Key 了,Exchange 直接将消息发送到和它绑定的所有 Queue 中,省略了 Routing Key 匹配的环节。

2、Direct Exchange

Direct 类型交换机原理图

在 RabbitMQ 中默认使用的是 Direct Exchange,Exchange 和 Queue 绑定时需要指定 Routing Key,发送消息时也需要携带 Routing Key,这样 Exchange 收到消息后就可以根据 Routing Key 匹配到对应的 Binding,进而将消息发送到目标队列里。注意这里的 Routing Key 是需要精确匹配的。

3、Topic Exchange

Topic 类型交换机原理图

Topic Exchange 和 Direct Exchange 的用法很类似,区别在于 Topic Exchange 中的 Routing Key 是支持模糊匹配的。提供了两个通配符:

  • *,星号,可以匹配一个单词
  • #,井号,可以匹配0个、1个、多个单词

这样绑定 Exchange 绑定 Queue1、Queue2、Queue3 时指定 Routing Key 分别为*.red.##.blue.#green.*,这样发送消息是如果携带的 Routing Key 为 green.red,最终可以匹配到 Queue1、Queue3。

4、Default Exchange

Default Exchange 是一种特殊的 Direct Exchange,使用它时,我们只需要创建一个 Queue 即可,RabbitMQ 服务会自动将 Queue 和一个名称为空的默认的 Exchange 绑定,同时将 Routing Key 指定为 Queue 的名称。这种 Exchange 简化了使用步骤,但也不够灵活,不好做实际的业务划分,可以用来完成一些简单的需求。

5、Headers Exchange

Headers Exchange 不使用 Routing Key 来匹配目标 Queue,而是绑定 Exchange 和 Queue 时需要指定额外的 Arguments 参数,发送消息时携带上对应的参数来实现匹配。这种 Exchange 用的比较少,了解即可。

一般情况下使用 Fanout ExcahngeDirect Exchange就能满足业务需求了。

相关文章

网友评论

      本文标题:理解 RabbitMQ 工作流程

      本文链接:https://www.haomeiwen.com/subject/efzzjltx.html