3.4.Direct交换机

简介: Direct交换机根据RoutingKey精确匹配队列,实现消息的定向路由;而Topic交换机支持通配符绑定,RoutingKey为用.分隔的多个单词,可实现更灵活的消息匹配与分发。

3.4.1 介绍
在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。

在Direct模型下:
● 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
● 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey。
● Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息
案例需求如图:

  1. 声明一个名为hmall.direct的交换机
  2. 声明队列direct.queue1,绑定hmall.direct,bindingKey为blud和red
  3. 声明队列direct.queue2,绑定hmall.direct,bindingKey为yellow和red
  4. 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
  5. 在publisher中编写测试方法,向hmall.direct发送消息
    3.4.2 测试
    3.4.2.1 创建队列和交换机
    首先在控制台声明两个队列direct.queue1和direct.queue2,这里不再展示过程:

然后声明一个direct类型的交换机,命名为hmall.direct:

然后使用red和blue作为key,绑定direct.queue1到hmall.direct:

同理,使用red和yellow作为key,绑定direct.queue2到hmall.direct,步骤略,最终结果:

3.4.2.2 监听队列
在consumer服务的SpringRabbitListener中添加方法:
@RabbitListener(queues = "direct.queue1")
public void listenDirectQueue1(String msg) {
System.out.println("消费者1接收到direct.queue1的消息:【" + msg + "】");
}

@RabbitListener(queues = "direct.queue2")
public void listenDirectQueue2(String msg) {
System.out.println("消费者2接收到direct.queue2的消息:【" + msg + "】");
}
3.4.2.3 消息发送
在publisher服务的SpringAmqpTest类中添加测试方法:
@Test
public void testSendDirectExchange() {
// 交换机名称
String exchangeName = "hmall.direct";
// 消息
String message = "红色警报!日本乱排核废水,导致海洋生物变异,惊现哥斯拉!";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "red", message);
}
由于使用的red这个key,所以两个消费者都收到了消息:

我们再切换为blue这个key:
@Test
public void testSendDirectExchange() {
// 交换机名称
String exchangeName = "hmall.direct";
// 消息
String message = "最新报道,哥斯拉是居民自治巨型气球,虚惊一场!";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "blue", message);
}
你会发现,只有消费者1收到了消息:

3.4.3 小结
描述下Direct交换机与Fanout交换机的差异?
● Fanout交换机将消息路由给每一个与之绑定的队列
● Direct交换机根据RoutingKey判断路由给哪个队列
● 如果多个队列具有相同的RoutingKey,则与Fanout功能类似
3.5.Topic交换机(自行测试)
3.5.1 介绍
Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。
只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符!
BindingKey 一般都是有一个或多个单词组成,多个单词之间以.分割,例如: item.insert
通配符规则:
● #:匹配零个或多个词
:匹配不多不少恰好1个词
举例:
● item.#:能够匹配item.spu.insert 或者 item.spu
● item.
:只能匹配item.spu
图示:

假如此时publisher发送的消息使用的RoutingKey共有四种:
● china.news 代表有中国的新闻消息;
● china.weather 代表中国的天气消息;
● japan.news 则代表日本新闻
● japan.weather 代表日本的天气消息;
解释:
● topic.queue1:绑定的是china.# ,凡是以 china.开头的routing key 都会被匹配到,包括:
○ china.news
○ china.weather
● topic.queue2:绑定的是#.news ,凡是以 .news结尾的 routing key 都会被匹配。包括:
○ china.news
○ japan.news
3.5.2 测试
3.5.2.1 创建队列和交换机
接下来,我们就按照上图所示,来演示一下Topic交换机的用法。
首先,在控制台按照图示例子创建队列、交换机,并利用通配符绑定队列和交换机。
创建队列:topic.queue1、topic.queue2
创建交换机:hmall.topic
绑定队列:
topic.queue1:绑定的是china.#
topic.queue2:绑定的是#.news
最终结果如下:

3.5.2.2 消息接收
在consumer服务的SpringRabbitListener中添加方法:
@RabbitListener(queues = "topic.queue1")
public void listenTopicQueue1(String msg){
System.out.println("消费者1接收到topic.queue1的消息:【" + msg + "】");
}

@RabbitListener(queues = "topic.queue2")
public void listenTopicQueue2(String msg){
System.out.println("消费者2接收到topic.queue2的消息:【" + msg + "】");
}
3.5.2.3 消息发送
在publisher服务的SpringAmqpTest类中添加测试方法:
/**

  • topicExchange
    /
    @Test
    public void testSendTopicExchange() {
    // 交换机名称
    String exchangeName = "hmall.topic";
    // 消息
    String message = "喜报!孙悟空大战哥斯拉,胜!";
    // 发送消息
    rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
    }
    执行测试方法,routingKey为china.news可以匹配topic.queue1和topic.queue2,日志输出:
    消费者1接收到topic.queue1的消息:【喜报!孙悟空大战哥斯拉,胜!】
    消费者2接收到topic.queue2的消息:【喜报!孙悟空大战哥斯拉,胜!】
    更改routingKey为china.weather,只可以匹配到topic.queue1,日志输出:
    消费者1接收到topic.queue1的消息:【喜报!孙悟空大战哥斯拉,胜!】
    3.5.3 小结
    描述下Direct交换机与Topic交换机的差异?
    ● Topic交换机接收的消息RoutingKey必须是多个单词,以 . 分割
    ● Topic交换机与队列绑定时的bindingKey可以指定通配符
    ● #:代表0个或多个词
    :代表1个词
相关文章
|
11天前
|
机器学习/深度学习 缓存 物联网
打造社交APP人物动漫化:通义万相wan2.x训练优化指南
本项目基于通义万相AIGC模型,为社交APP打造“真人变身跳舞动漫仙女”特效视频生成功能。通过LoRA微调与全量训练结合,并引入Sage Attention、TeaCache、xDIT并行等优化技术,实现高质量、高效率的动漫风格视频生成,兼顾视觉效果与落地成本,最终优选性价比最高的wan2.1 lora模型用于生产部署。(239字)
277 36
|
12天前
|
数据采集 人工智能 安全
|
26天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2025 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
阿里云微服务引擎 MSE 及 API 网关 2025 年 11 月产品动态
|
12天前
|
人工智能 物联网 测试技术
ModelScope魔搭社区发布月报 -- 25年12月
魔搭社区12月重磅更新DeepSeek 3.2、Mistral-3等模型,Z-Image-Turbo引领文生图生态,平台全面升级加速开源模型落地。
178 8
|
存储 缓存 NoSQL
阿里云 Tair 联手 SGLang 共建 HiCache,构建面向“智能体式推理”的缓存新范式
本文系统剖析面向智能体推理的 KVCache 技术演进,针对传统机制在长上下文、多轮决策与多智能体协同中的状态膨胀、持久化缺失和缓存孤立三大瓶颈,介绍阿里云 Tair KVCache 团队联合 SGLang 社区推出的 HiCache 分层缓存体系。该方案通过显存-内存-3FS 多级卸载与全局共享,实现缓存命中率提升至80%,TTFT 降低56%,推理 QPS 翻倍,支撑智能体时代的大模型高效推理。
|
13天前
|
消息中间件 人工智能 NoSQL
AgentScope x RocketMQ:打造企业级高可靠 A2A 智能体通信基座
基于 RocketMQ SDK 实现了 A2A 协议的 ClientTransport 接口(部分核心代码现已开源),并与 AgentScope 框架深度集成,共同构建了全新的 A2A 智能体通信基座,为多智能体应用提供企业级、高可靠的异步协同方案。
190 21
|
7天前
VTP:MiniMax海螺视频团队,首次开源!
MiniMax视频团队推出首个开源工作VTP,首次将视觉tokenizer作为scaling主角,通过融合通用表征学习,实现生成性能随参数、算力、数据规模持续提升,展现tokenizer在视觉生成系统中的核心潜力。
109 3
|
11天前
|
消息中间件 人工智能 NoSQL
AgentScope x RocketMQ:打造企业级高可靠 A2A 智能体通信基座
Apache RocketMQ 推出轻量级通信模型 LiteTopic,专为 AI 场景设计,结合 A2A 协议与 AgentScope 框架,实现多智能体高效、可靠协作,支持海量会话持久化、断点续传与动态订阅,重塑企业级 AI 应用架构。
136 26
|
13天前
|
人工智能 自然语言处理 语音技术
通义百聆语音双子星,同步开源!
通义百聆全新升级,推出Fun-CosyVoice3与Fun-ASR系列模型。3秒录音即可实现9种语言、18种方言及多情感音色克隆,支持中英混说、跨语种合成;Fun-ASR识别准确率高达93%,支持31种语言自由混说、歌词说唱识别,并开源轻量级模型,助力高效本地部署与定制开发。
284 5
通义百聆语音双子星,同步开源!

热门文章

最新文章