RabbitMQ中的Topic模式

  1. 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 引入依赖:

com.rabbitmq amqp-client 5.20.0 1 2 3 4 5 2.2 生产者代码 生产者负责发送消息到 topic 交换机,并指定路由键。

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 模式的通配符匹配功能。

  1. 总结
    RabbitMQ 的 Topic 模式通过通配符匹配的方式,提供了灵活的消息分发机制,适用于复杂的场景。通过本文的介绍和代码示例,读者可以深入理解 Topic 模式的工作原理,并掌握如何在 Java 中实现 Topic 模式。

在实际应用中,Topic 模式可以用于日志收集、事件驱动架构等场景,帮助开发者构建高效、可扩展的分布式系统。
最后关注灵活就业新动态,了解更多行业资讯、前沿技术请关注公众号:贤才宝(贤才宝https://www.51xcbw.com)

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

posted @ 2025-02-05 15:22  测试小萌新一枚  阅读(1324)  评论(0)    收藏  举报