文章目录
- Topic 交换机概述
- Routing Key 与 Binding Key
- 优缺点及场景
- 优点
- 缺点
- 应用场景
- 案例演示
- 创建队列和交换机:
- 消费者代码:
- 消息发送代码:
- 测试:
- 总结
Topic 交换机概述
- 路由机制: Topic交换机与Direct交换机类似,也是基于
routing key
进行消息路由。 - Routing Key 格式: 通常由多个单词组成,用点 (
.
) 分隔。例如:china.news
,china.weather
,等等。 - 含义: 每个单词代表某种特定含义,如
china.news
表示中国的新闻,china.weather
表示中国的天气。
Routing Key 与 Binding Key
- Routing Key: 发送消息时指定的路由键,通常由多个单词组成。
- Binding Key: 队列和交换机之间的绑定键,也可以由多个单词组成,允许使用通配符。
- 通配符
*
星号: 表示一个单词。用于匹配一个具体的单词。#
井号: 表示零个或多个单词。用于匹配多个单词或完全不匹配。- 示例:
china.#
:匹配以china
开头的任何消息,如china.news
、china.weather
都匹配。*.news
:匹配任何以.news
结尾的消息,如china.news
、japan.news
等。china.*
:只匹配china
后跟一个单词的消息,如china.news
,但不匹配china.weather
。
优缺点及场景
优点
- 灵活性: 使用通配符可以减少绑定多个键的复杂性。例如,
china.#
可以代替多个绑定china.news
,china.weather
等。 - 扩展性: 如果后续添加新的消息类型(如
china.sports
),不需要修改现有配置,直接匹配china.#
就能涵盖新类型。
缺点
- 性能影响: 通配符匹配比直接匹配消耗更多的计算资源,虽然影响较小。
应用场景
- 适合多种类型的消息路由: 如果有多个不同的消息类型(如新闻、天气),并且这些类型有相似的前缀或后缀,使用
topic
交换机可以大大简化配置。 - 可动态扩展: 当新的消息类型出现时,只需要简单地添加通配符绑定,无需多次配置。
案例演示
利用 SpringAMQP 演示 TopicExchange 的使用
- 在 RabbitMQ 控制台中,声明队列 topic.queue1 和 topic.queue2
- 在RabbitMQ 控制台中,声明交换机 hmall.topic,将两个队列与其绑定
- 在 consumer 服务中,编写两个消费者方法,分别监听 topic.queue1 和 topic.queue2
- 在 publisher 中编写测试方法,向 hamll.topic 发送消息
创建队列和交换机:
-
在 RabbitMQ 控制台创建两个队列
topic.queue1
和topic.queue2
,以及一个topic
类型的交换机nhuan.topic
。
-
使用
china.#
和*.news
作为binding key
进行绑定。
消费者代码:
- 创建两个消费者,分别监听
topic.queue1
和topic.queue2
。
@RabbitListener(queues = "topic.queue1")
public void listenTopicQueue1(String message) {log.info("消费者1接收到 topic.queue1 的消息: " + message);
}@RabbitListener(queues = "topic.queue2")
public void listenTopictQueue2(String message) {log.info("消费者2接收到 topic.queue2 的消息: " + message);
}
消息发送代码:
- 使用
rabbitTemplate.convertAndSend
发送消息到指定的交换机,并设置routing key
。
@Test
public void testTopicQueue1() {// 交换机名称String exchangeName = "nhuan.topic";// 消息String message = "新闻:中国收复小日子。";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}@Test
public void testTopicQueue2() {// 交换机名称String exchangeName = "nhuan.topic";// 消息String message = "天气:今天天气不错。";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "china.weather", message);
}
测试:
china.news
会同时匹配topic.q1
和topic.q2
,所以两个消费者都会收到。
china.weather
只会匹配topic.queue1
,所以只有消费者1收到消息。
总结
- 与 Direct 交换机的区别: Topic交换机使用多单词组成的
routing key
,并且支持通配符匹配,提供更大的灵活性和扩展性。 - 适合的场景: 当需要根据不同的消息类型(如不同国家的新闻、天气等)进行路由时,
topic
交换机非常合适。