RabbitMQ中的Topic模式
- Topic 模式的工作原理
1.1 Topic 模式概述
在 RabbitMQ 中,Topic 模式是基于 交换机类型为 topic 的一种消息传递模式。与 Direct 模式(精确匹配)和 Fanout 模式(广播)不同,Topic 模式允许生产者发送消息到特定的交换机,并根据消息的 路由键(Routing Key) 和 绑定键(Binding Key) 的匹配规则,将消息分发到相应的队列。
![]()
1.2 关键概念
1.2.1 交换机(Exchange)
在 Topic 模式中,消息不会直接发送到队列,而是发送到一个 topic 类型的交换机。交换机根据消息的路由键和队列的绑定键进行匹配,决定将消息分发到哪些队列。
1.2.2 路由键(Routing Key)
路由键是生产者在发送消息时指定的字符串,用于描述消息的主题或类别。路由键通常由多个单词组成,单词之间用点号(.)分隔,例如:user.logs.info。
1.2.3 绑定键(Binding Key)
绑定键是消费者在绑定队列到交换机时指定的字符串,用于描述队列感兴趣的主题或类别。绑定键的格式与路由键相同,但支持通配符匹配。
1.2.4 通配符
Topic 模式支持两种通配符:
*(星号):匹配一个单词。
(井号):匹配零个或多个单词。
例如:
.logs.:匹配所有包含 logs 的消息,如 user.logs.info 或 system.logs.error。
.error:匹配所有以 error 结尾的消息,如 system.logs.error 或 user.error。
1.3 消息分发流程
生产者发送消息到 topic 类型的交换机,并指定路由键。
交换机根据路由键和队列的绑定键进行匹配。
如果匹配成功,消息会被分发到相应的队列。
消费者从队列中消费消息。
2. Topic 模式的 Java 代码实现
下面通过一个简单的 Java 代码示例,展示如何在 RabbitMQ 中实现 Topic 模式。
2.1 环境准备
在开始之前,请确保已经安装并运行了 RabbitMQ 服务,并且安装了 RabbitMQ 的 Java 客户端库。可以通过 Maven 引入依赖:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class TopicProducer {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] args) throws Exception {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
// 创建连接和通道
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 声明一个 topic 类型的交换机
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
// 定义路由键和消息内容
String routingKey = "user.logs.info"; // 可以修改为其他路由键
String message = "This is a log message from user.";
// 发送消息到交换机
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + routingKey + "': '" + message + "'");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2.3 消费者代码
消费者负责从队列中接收消息,并根据绑定键过滤感兴趣的消息。
import com.rabbitmq.client.*;
public class TopicConsumer {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] args) throws Exception {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 声明一个 topic 类型的交换机
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
// 创建一个临时队列,并绑定到交换机
String queueName = channel.queueDeclare().getQueue();
String bindingKey = "user.#"; // 可以修改为其他绑定键
channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
// 创建消费者并开始消费消息
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + "': '" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
3. 运行示例
3.1 启动 RabbitMQ 服务
确保 RabbitMQ 服务已经启动并运行。如果使用 Docker,可以通过以下命令启动 RabbitMQ:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
1
3.2 运行生产者和消费者
运行 TopicProducer 类,发送消息到交换机。
运行 TopicConsumer 类,接收并处理消息。
3.3 测试不同的路由键和绑定键
修改生产者的 routingKey,例如:system.logs.error。
修改消费者的 bindingKey,例如:#.error 或 .logs.。
观察消息的分发情况,验证 Topic 模式的通配符匹配功能。
- 总结
RabbitMQ 的 Topic 模式通过通配符匹配的方式,提供了灵活的消息分发机制,适用于复杂的场景。通过本文的介绍和代码示例,读者可以深入理解 Topic 模式的工作原理,并掌握如何在 Java 中实现 Topic 模式。
在实际应用中,Topic 模式可以用于日志收集、事件驱动架构等场景,帮助开发者构建高效、可扩展的分布式系统。
最后关注灵活就业新动态,了解更多行业资讯、前沿技术请关注公众号:贤才宝(贤才宝https://www.51xcbw.com)

有没有软件行业离职或者失业状态的,公司招标需要可以给个人上基本社保,费用由公司承担,有需要的联系我,真实需求——拜托非诚勿扰,大家的时间都宝贵。
徐女士13331180327


浙公网安备 33010602011771号