RabbitMQ入门指南(四):交换机与案例解析

简介: RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了交换机在RabbitMQ中的作用与类型、交换机案例(Fanout交换机、Direct交换机、Topic交换机)等内容。

一、交换机在RabbitMQ中的作用与类型

在RabbitMQ中,交换机是一个核心组件,它起到了连接生产者、队列和交换机之间的桥梁作用。交换机的存在改变了消息发送的模式,它接收生产者的消息,并根据特定的路由规则,将消息转发到相应的队列。

案例模型:


交换机的类型:

  • Fanout交换机
  • 类型:广播
  • 功能:将消息发送给所有绑定到交换机的队列。这意味着,无论队列是否订阅了消息,只要它们与交换机绑定,它们都会收到消息。
  • 示例:如果有一个Fanout交换机,并且有两个队列A和B分别绑定到了这个交换机上。当生产者向这个交换机发送消息时,A和B两个队列都会收到这条消息。
  • Direct交换机
  • 类型:订阅
  • 功能:基于RoutingKey(路由键)将消息发送给订阅了相应RoutingKey的队列。如果一个队列没有订阅某个RoutingKey的消息,那么它就不会收到这个消息。
  • 示例:假设有两个队列A和B,它们都订阅了RoutingKey为"key1"的消息。如果有一个Direct交换机,并且它接收到一条RoutingKey为"key1"的消息,那么这条消息会被发送到A和B两个队列。
  • Topic交换机
  • 类型:通配符订阅
  • 功能:基于RoutingKey(路由键)发送消息给订阅了与RoutingKey匹配的队列。与Direct交换机不同的是,RoutingKey可以使用通配符。
  • 示例:假设有两个队列A和B,A订阅了"key.#"的消息,B订阅了"key.*"的消息。如果有一个Topic交换机,并且它接收到一条RoutingKey为"key.test"的消息,那么这条消息会被发送到A和B两个队列。
  • Headers交换机
  • 类型:头匹配
  • 功能:基于消息的头部属性进行匹配,将消息发送给匹配了这些属性的队列。这种类型的交换机使用的较少。

交换机的选择和使用:

在选择和使用交换机时,需要根据业务需求和场景来决定使用哪种类型的交换机。如果需要将消息广播给所有相关的队列,那么Fanout交换机是一个很好的选择。如果需要根据特定的RoutingKey将消息发送给特定的队列,那么Direct或Topic交换机是合适的选择。而Headers交换机由于其较少的使用场景和特定的行为,通常在特定的情况下才会使用。

二、交换机案例

1.Fanout交换机(广播

案例模型:


  • 多个队列:在这种模式下,可以存在多个队列,这些队列都绑定到同一个交换器上。
  • 队列与交换器的绑定:每个队列都需要绑定到至少一个交换器上。这是消息路由的关键步骤,因为只有绑定了交换器的队列才能接收来自该交换器的消息。
  • 生产者发送消息:生产者将消息发送到交换机,而不是直接发送到队列。这意味着生产者不需要知道关于队列的任何信息,只需要知道交换器的存在和如何将消息发送到交换器。
  • 交换机的行为:当交换机接收到来自生产者的消息时,它会将这个消息发送到所有与该交换机绑定的队列。这是一个非常强大的特性,因为它允许一个消息被广播到多个队列,每个队列都可以有自己的消费者来处理这个消息。
  • 消费者接收消息:如果一个或多个消费者订阅了某个队列,那么他们都可以接收到来自该队列的消息。这意味着消费者不需要知道关于交换机的任何信息,只需要知道如何订阅和接收来自特定队列的消息。

在RabbitMQ管理控制台新建两个队列:



查看新建结果:


新建一个交换机,选择fanout类型:


查看新建结果:


绑定两个队列到交换机:



查看绑定结果:


在publisher服务中的测试类添加一个测试方法,实现消息发送

@Test
    void testSendFanout() {
        String exchangeName = "demo.fanout";
        String msg = "Fanout Exchange test";
        rabbitTemplate.convertAndSend(exchangeName, null, msg);
    }

image.gif

在consumer服务的类中添加2个新的方法,作为消费者:

@RabbitListener(queues = "fanout1.queue")
    public void listenFanoutQueue1(String msg) {
        System.out.println("fanout1:" + msg);
    }
    @RabbitListener(queues = "fanout2.queue")
    public void listenFanoutQueue2(String msg) {
        System.out.println("fanout2" + msg);
    }

image.gif

运行结果:

image.gif

2.Direct交换机(订阅

案例模型:


在Direct模型中,消息并不是被发送到所有绑定的队列,而是基于一个特定的路由键(RoutingKey)来决定其目的地。这种模型的好处是提供了更高的灵活性和控制性。通过使用不同的RoutingKey,可以将消息发送到特定的队列,从而实现更复杂的消息处理逻辑。

  • 队列与交换机的绑定:在Direct模型下,队列与交换机的绑定不再是任意的。当队列绑定到交换机时,必须指定一个RoutingKey。这个RoutingKey可以被看作是决定消息路由的“标签”或“地址”。
  • 消息的发送与路由键:当消息的发送方(生产者)向交换机发送消息时,它必须为该消息指定一个RoutingKey。这个RoutingKey代表了消息的预期目的地或类别。
  • Exchange的消息路由决策:与Fanout模型不同,Direct模型中的交换机并不会将接收到的消息发送给所有绑定的队列。相反,它会查看每个消息的RoutingKey,并与绑定时设置的RoutingKey进行比较。只有当队列的RoutingKey与消息的RoutingKey完全匹配时,该队列才会接收到这个消息。

在RabbitMQ管理控制台新建两个队列:



查看新建结果:


新建一个交换机,选择direct类型:


查看新建结果:


绑定两个队列到交换机,指定RoutingKey:





查看绑定结果:

 


在consumer服务的类中添加2个新的方法,作为消费者进行消息接收

@RabbitListener(queues = "direct1.queue")
    public void listenDirectQueue1(String msg) {
        System.out.println("direct1:" + msg);
    }
    @RabbitListener(queues = "direct2.queue")
    public void listenDirectQueue2(String msg) {
        System.out.println("direct2:" + msg);
    }

image.gif

在publisher服务中的测试类添加一个测试方法,设置RoutingKeyred,实现消息发送

@Test
    public void testSendDirectExchange() {
        // 交换机名称
        String exchangeName = "demo.direct";
        // 消息
        String message = "Direct Exchange Red test";
        // 发送消息
        rabbitTemplate.convertAndSend(exchangeName, "red", message);
    }

image.gif

运行结果:


在publisher服务中的测试类修改测试方法,设置RoutingKeyblue

@Test
    public void testSendDirectExchange() {
        // 交换机名称
        String exchangeName = "demo.direct";
        // 消息
        String message = "Direct Exchange Red test";
        // 发送消息
        rabbitTemplate.convertAndSend(exchangeName, "blue", message);
    }

image.gif

运行结果(只有消费者1收到了消息 ):


3.Topic交换机(通配符订阅

案例模型:


在RabbitMQ的Topic模型中,消息的路由规则更加灵活和高级。与Direct模型不同,Topic模型允许使用通配符来进行路由键匹配。通过使用通配符,可以匹配多个队列,从而实现更复杂的消息处理逻辑。

  • 队列与交换机的绑定:在Topic模型下,队列与交换机的绑定仍然需要指定一个RoutingKey。然而,这个RoutingKey可以包含通配符,以提供更广泛的匹配选项。
  • 消息的发送与路由键:当消息的发送方(生产者)向交换机发送消息时,它仍然需要为该消息指定一个RoutingKey。这个RoutingKey可以包含通配符,以便在多个队列之间进行匹配。
  • 交换机和路由决策:在Topic模型中,交换机会查看每个消息的RoutingKey,并与绑定时设置的RoutingKey进行比较。如果消息的RoutingKey与队列的RoutingKey匹配(包括使用通配符进行匹配),则该队列会接收到这个消息。

在RabbitMQ管理控制台新建两个队列:



查看新建结果:


新建一个交换机,选择Topic类型:


查看新建结果:


绑定两个队列到交换机,指定RoutingKey:



查看绑定结果:


在consumer服务的类中添加2个新的方法,作为消费者进行消息接收

@RabbitListener(queues = "topic1.queue")
    public void listenTopicQueue1(String msg) throws InterruptedException {
        System.out.println("topic1:" + msg);
    }
    @RabbitListener(queues = "topic2.queue")
    public void listenTopicQueue2(String msg) throws InterruptedException {
        System.out.println("topic1:" + msg);
    }

image.gif

在publisher服务中的测试类添加一个测试方法,设置RoutingKeychina.news,实现消息发送

@Test
    void testSendTopic() {
        String exchangeName = "demo.topic";
        String msg = "Topic Exchange test1";
        rabbitTemplate.convertAndSend(exchangeName, "china.news", msg);
    }

image.gif

运行结果:


在publisher服务中的测试类修改测试方法,设置RoutingKeychina.date

@Test
    void testSendTopic() {
        String exchangeName = "demo.topic";
        String msg = "Topic Exchange test";
        rabbitTemplate.convertAndSend(exchangeName, "china.date", msg);
    }

image.gif

运行结果(只有消费者1收到了消息 ):



总结

RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了交换机在RabbitMQ中的作用与类型、交换机案例(Fanout交换机、Direct交换机、Topic交换机)等内容,希望对大家有所帮助。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
7天前
|
安全 网络性能优化 网络虚拟化
网络交换机分类与功能解析
接入交换机(ASW)连接终端设备,提供高密度端口与基础安全策略;二层交换机(LSW)基于MAC地址转发数据,构成局域网基础;汇聚交换机(DSW)聚合流量并实施VLAN路由、QoS等高级策略;核心交换机(CSW)作为网络骨干,具备高性能、高可靠性的高速转发能力;中间交换机(ISW)可指汇聚层设备或刀片服务器内交换模块。典型流量路径为:终端→ASW→DSW/ISW→CSW,分层架构提升网络扩展性与管理效率。(238字)
157 0
|
3月前
|
消息中间件 存储 Kafka
一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
本文详细介绍了分布式消息中间件RocketMQ的核心概念、部署方式及使用方法。RocketMQ由阿里研发并开源,具有高性能、高可靠性和分布式特性,广泛应用于金融、互联网等领域。文章从环境搭建到消息类型的实战(普通消息、延迟消息、顺序消息和事务消息)进行了全面解析,并对比了三种消费者类型(PushConsumer、SimpleConsumer和PullConsumer)的特点与适用场景。最后总结了使用RocketMQ时的关键注意事项,如Topic和Tag的设计、监控告警的重要性以及性能与可靠性的平衡。通过学习本文,读者可掌握RocketMQ的使用精髓并灵活应用于实际项目中。
2144 8
 一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
|
6月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生<audio>标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
221 12
|
7月前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
7月前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
6月前
|
Java 关系型数据库 数据库连接
Javaweb之Mybatis入门程序的详细解析
本文详细介绍了一个MyBatis入门程序的创建过程,从环境准备、Maven项目创建、MyBatis配置、实体类和Mapper接口的定义,到工具类和测试类的编写。通过这个示例,读者可以了解MyBatis的基本使用方法,并在实际项目中应用这些知识。
159 11
|
6月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
10月前
|
机器学习/深度学习 数据采集 数据挖掘
Python编程语言的魅力:从入门到进阶的全方位解析
Python编程语言的魅力:从入门到进阶的全方位解析
|
10月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
231 3
|
11月前
|
消息中间件 存储 监控
RocketMQ消息重试机制解析!
RocketMQ消息重试机制解析!
763 1
RocketMQ消息重试机制解析!

推荐镜像

更多
  • DNS