跳到主要内容

消息发送模式实战之直接模式与主题模式

1. 前言

Hello,大家好。在前面几章中,我们重点介绍了 RabbitMQ 的所有基础知识内容,这些基础知识内容是入门 RabbitMQ 的关键,是后续用好 RabbitMQ 的基础。

那么,从本章开始呢,作为本套课程的最后一章内容,考虑到同学们的工作应用场景,所以,本章会为同学们介绍一些关于 RabbitMQ 实战方向的内容,包括但不限于对我们工作中常用功能的优化,以及对程序环境的优化。

本小节作为 RabbitMQ 实战章节的开篇小节,会首先为同学们介绍之前我们讲过的,消息发送模式系列的实战内容,老师会通过概念加代码的形式来进行讲解。

本节主要内容:

  • 直接模式与主题模式基础概念回顾;
  • 直接模式与主题模式代码实操。

2.直接模式与主题模式基础概念回顾

从本小节开始,老师会首先为同学们介绍消息发送模式的实战部分内容,本节会介绍消息发送模式之直接模式与主题模式的实战内容,在我们正式开始使用代码进行实战之前,让我们先来回顾一下消息发送模式之间接模式与主题模式的基础概念。

2.1 直接模式基础概念回顾

定义:

直接模式,即直接发送消息模式,指的是将消息直接发送给消费者。

描述:

直接模式允许将多个队列绑定到一个交换机上,在生产者发送消息给交换机时,需要携带一个 key ,而这个 key 一般被称为 routing key 或者 binding key,所以直接模式有时也被称为路由模式。

Tips: RabbitMQ 一般将这个 key 叫做 binding key,但是在实际情况中,出于字面意思,习惯性地将 key 叫做 routing key

直接模式总共分为两种业务场景,我们先来看第一种业务场景,一般被叫做’单 key 绑定’,如下图所示:

我们再来看直接模式的最后一个业务场景,多重 key 绑定,如下图所示:

在图中我们可以看到,Q1、Q2 两个队列,分别绑定到了 routing key 均为 black 的 direct 交换机上,即名称相同的一个 key 绑定到了多个队列上面,这种现象被称为多重 key 绑定。

在多重 key 绑定下,生产者生产的消息均会被发送到相同 key 值所绑定的队列上面,这里需要同学们注意。

2.2 主题模式基础概念回顾

定义:

主题模式,也被称为通配符模式,官网一般称为主题模式,即交换机与消息队列所绑定的 key 值可以像匹配通配符的方式,来匹配消息队列,到底什么意思呢,我们往下看。

描述:

主题模式对 routing key 的匹配规则做了改进,上述其他四种模式中有涉及 key 匹配的地方都是完全匹配,即名称必须相等时才能把 key 匹配上,而对于主题模式,则不需要这样。

主题模式将 key 值中的每个单词或者关键词,使用英文状态下的 . 符号进行间隔,如上图所示。

我们这里只是对直接消息发送模式,和主题消息发送模式的基础概念进行了一个简单的回顾,如果有同学忘了这些基础概念,可以回过头去 《RabbitMQ 消息发送模式详解》 这一小节复习。

3 直接模式与主题模式代码实操

3.1 直接模式代码实操

在上述基础概念中,我们对直接消息发送模式的两种基础业务场景做了介绍,下面会分别用代码实现这两种业务场景,实现代码如下所示(以下均为消费者代码,生产者请自行实现):

实现代码:

// 直接模式第一种业务场景
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueBind(QUEUE_ONE, EXCHANGE_NAME, "Routing Key");
channel.close();
connection.close();

代码解释:

第 1-5 行,我们使用了 RabbitMQ 的 ConnectionFactory 连接工厂,来初始化了一些获取 RabbitMQ 连接的必要参数;

第 6 行,我们从 RabbitMQ 的连接工厂中,获取到了一个 RabbitMQ Conneciton 连接实例;

第 7 行,我们通过 RabbitMQ 连接实例,创建了一个 channel 通道,为之后的消息通信提供媒介;

第 8 行,我们将创建出来的 channel 通道与我们的队列相绑定,并单独指定了一个名为 Routing Key 的 key 值。

第 9-10 行,在处理完通道与连接实例之后,我们分别调用了 close 方法,将建立的通信连接和通道进行关闭,以节省资源开销。

以上代码是我们实现的直接模式的,第一种业务场景,即单 key 绑定的业务场景,因为我们在 queueBind 方法中,为一个队列指定了一个单一的 key 值。接下来让我们看一下第二种业务场景的实现:

实现代码:

// 直接模式第二种业务场景
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueBind(QUEUE_ONE, EXCHANGE_NAME, "Routing Key");
channel.queueBind(QUEUE_TWO, EXCHANGE_NAME, "Routing Key");
channel.close();
connection.close();

代码解释:

第 1-7 行,代码和第一种业务场景相似,这里不再赘述;

第 8-9 行,我们分别使用 channel 的 queueBind 方法来为两个不同的队列,声明了同样的 Routing Key 值。

第 10-11 行,代码和第一种业务场景相似,这里不再赘述;

这里我们重点看第 8-9 行代码,我们为两个不同的消息队里指定了同一个 Routing Key 的值,那么再有消息过来时,同一条消息就会发送到这两条队列中,这就是第二种业务场景,即多重 key 绑定业务场景。

3.2 主题模式代码实操

我们来看主体模式的代码实现:

实现代码:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "key.\*");
channel.close();
connection.close();

代码解释:

第 1-7 行,代码和第一种业务场景相似,这里不再赘述;

第 8 行,我们使用 channel 的 queueBind 方法来将消息队列和通道进行绑定,并声明了名为 key.* 的 Routing Key 值。

第 10-11 行,代码和第一种业务场景相似,这里不再赘述;

当我们设置了 key.* 的 Routing Key 值之后,我们的消息就会根据这个规则进行匹配的分发,这就是主题模式。

Tips:

  1. 我们在实现直接消息发送模式的时候,一定要注意我们的业务场景,key 值的设定一定要符合实际情况;
  2. 我们在实现主体消息发送模式的时候,要注意我们 key 值的一个匹配规则,要根据实际需要进行设置,不要随意设置。

4. 小结

本小节为同学们详细介绍了 RabbitMQ 消息发送模式之直接模式与主题模式的代码实操等内容,包括直接模式与主题模式基础概念等内容的回顾,以及直接模式常见的两种业务场景的代码实现、主题模式的代码实现,同学们需要理清代码实现的思路和步骤。