1. 前言

因为生产环境存在不同的消息分发要求,例如对于注册流程,同一条注册消息需要发送到短信模块和邮箱模块,而对于请求削峰场景,同一条消息只需要发送到业务服务后端即可。我们可以通过配置 RabbitMQ 工作模式来决定发送单个队列还是多个队列,以及配置特定的路由规则。

2. RabbitMQ 工作模式

面试官提问:RabbitMQ 有哪些发布订阅模式?有什么区别?

题目解析

这里主要考察候选人对消息队列不同发布/订阅架构模型的了解程度,我们首先给出RabbitMQ队列模型中不同模块的定义:

  • 生产者(Producer):发送消息到队列的模块;
  • 队列(Queue):存储消息的一段空间,作为消息的缓存模块;
  • 消费者(Consumer):从队列中接受消息的模块;
  • 交换机(Exchange):消息不直接发到队列,首先发到 Exchange 模块,再根据路由规则转发到定制化的队列。

其次,候选人需要画出五种工作模式的图示,并且说明对应特点。

2.1 简单队列

图片描述

(简单队列模型图,引用自官方文档)

简单队列模型的定义:只有一个生产者、一个消息队列、一个消费者。

优点是不需要配置复杂的路由规则,缺点是只支持点对点通信,不适合大部分需要分发消息的路由场景。

2.2 工作队列

图片描述

(工作队列模型图,引用自官方文档)

工作队列(Work Queue)模型的定义:一个生产者,拥有往多个消费者发送消息的能力,但是一条消息只能被一个消费者消费。

工作队列的应用场景是需要将流量打散到多个消费者模块的场景,例如电商秒杀的前置削峰消息队列。

2.3 发布/订阅队列

图片描述

(发布/订阅消息模型图,引用自官方文档)

发布/订阅(Publish/Subscribe)队列模型的定义:生产者只能往交换机(Exchange)模块发送消息,交换机绑定了多个队列,所有绑定该交换机的队列都会收到交换机中的所有消息。

交换机存在四种路由方式:direct、topic、headers和fanout模式。

发布/订阅模型是比较常用的队列模型,例如注册流程中,同一个用户请求需要往短信模块和邮箱模块发送消息,可以使用该模型。

2.4 路由队列

图片描述

(路由队列模型图,引用自官方文档)

路由(Routing)队列模型的定义:生产者将消息发送到 direct 模式的交换机,交换机和队列绑定的时候限制了路由 Key。当生产者发送一条消息的时候,会指定一条路由 Key,这条消息只会发送到对应的队列中。例如上图中指定key=orange的消息,只有 Q1 能收听到该条消息;指定key=black或者key=green的消息,只有 Q2 队列能收到到该消息。

路由队列的优势是能够定制化发送消息,消费者选择性收听消息,适合灵活变通的应用场景。

2.5 主题队列

图片描述

(主题队列模型图,引用自官方文档)

主题(Topics)队列模型的定义:实际上是基于路由队列的定制化配置,支持了key的通配符匹配,简单理解就是正则表达式+路由key。例如对于上图,*.orange只能匹配到a.orange类似的key,但是lazy.#可以匹配到lazy.a或者lazy.a.b类似的key。

因为定义基本相同,主题队列的应用场景类似路由队列。

3. 小结

本章节介绍了 RabbitMQ 的生产者、队列、消费者、交换机基本组件,以及五种工作队列模型,需要候选人能够画出每种队列的结构示意图,并且能够清晰阐述不同队列的使用特点以及能够适用的实战场景。