RabbitMQ交换机详解_tpoic 交换机 rabbitmq,2024年最新oppo大数据开发面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

1.2.特点
  1. 简便性:直连交换机部署简单,只需要将设备通过网线插入交换机的不同端口上即可实现设备之间的通信和数据传输。这种方式比使用集线器或路由器进行局域网连接更加方便。
  2. 高效性:直连交换机能够提供高速的数据传输和转发能力,可以满足大多数用户的需求。与集线器相比,它更能支持多种传输速率和协议,并且能够根据MAC地址进行数据包的转发,提高了数据传输的效率。
  3. 稳定性:直连交换机有较好的稳定性,可以保证设备之间的通信质量和网络的稳定性。这种方式相比于使用路由器进行连接,可以避免路由器故障对整个网络的影响。
  4. 可扩展性:直连交换机可以通过增加端口数量来扩展网络容量,实现更多设备之间的通信和数据传输。通过连接多个交换机,可以构建更大规模的局域网。
1.3.缺点
  1. 端口数量有限:直连交换机通常具有有限的端口数量,这意味着它只能支持连接有限数量的设备。如果需要连接更多设备,就需要使用更大规模的交换机或者采用其他解决方案。
  2. 扩展性受限:由于直连交换机的端口数量有限,当需要扩展局域网并连接更多设备时,可能需要更换或升级交换机,这可能会带来额外的成本和配置工作。
  3. 单点故障:如果直连交换机发生故障,连接到该交换机上的所有设备都可能会受到影响,导致整个局域网中的通信中断。为了避免单点故障,可以考虑使用冗余交换机或者采用其他冗余设计。
  4. 限制广播域:直连交换机会限制广播域的范围。广播是网络中发送给所有设备的消息,当网络中的设备数量增加时,广播消息也会增加,可能会导致网络性能下降。为了解决这个问题,可以使用虚拟局域网(VLAN)或者更高级别的交换机。
  5. 可管理性有限:直连交换机通常提供有限的管理功能,无法提供像更高级别交换机那样的丰富功能和灵活性。这可能会限制网络管理员对交换机的配置和监控能力。
1.4.应用场景
  1. 数据中心服务器连接:直连交换机常用于连接数据中心中的服务器和存储设备,提供高带宽、低延迟的连接方式。这种方式可以满足对数据传输速度和响应时间要求较高的应用,如大规模数据处理、云计算等。
  2. 聚合链路:直连交换机可以用于将多个主机设备通过高速链路聚合成一个逻辑链路,以提供更大的带宽和冗余。通过聚合链路,可以实现负载均衡和故障切换,提高网络的可靠性和性能。
  3. 服务器虚拟化:直连交换机广泛应用于服务器虚拟化环境中。在虚拟化环境中,多个虚拟机需要共享物理服务器的网络资源,直连交换机可以为每个虚拟机提供独立的高速网络连接,确保虚拟机之间和与外部网络的通信效率和安全性。
  4. 存储网络连接:直连交换机也可用于连接存储设备,如SAN(存储区域网络)或NAS(网络附加存储)。这种连接方式可以提供高带宽、低延迟的存储访问,满足对存储性能要求较高的应用,如数据库、视频编辑等。
  5. 高性能计算:直连交换机常用于高性能计算领域,如科学计算、天气预报、金融模型等。通过直连交换机提供的高带宽、低延迟连接,可以加速数据传输和处理,提高计算效率和响应时间。

2. 主题交换机(Topic exchange)

2.1 基本概述

主题交换机(Topic Exchange)是一种消息队列的交换机类型,它通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种发布/订阅模式及其变种,通常用来实现消息的多播路由。

2.2.包含的组件
  1. 主题目录:存放不同主题模板的文件夹。每个主题目录都包含一组页面模板、样式表和其他相关资源。
  2. 主题管理器:提供主题预览、选择和安装等功能的界面。用户可以通过主题管理器选择合适的主题,并且可以在后台进行安装和升级。
  3. 主题切换器:用于在不同主题之间切换的接口。主题切换器可以是一个下拉菜单、按钮或者其他交互元素,用于触发主题切换操作。
  4. 主题引擎:负责将用户请求映射到相应的主题模板,并将数据填充到模板中生成最终的 HTML 页面。主题引擎通常会使用模板语言来支持动态内容的渲染。
2.3.优点
  1. 提供多样化的用户体验:通过主题交换机,用户可以自由选择不同的主题,从而获得不同的视觉和使用体验。这可以提高产品的吸引力和用户满意度。
  2. 提高网站可维护性:主题交换机可以将页面设计和内容分离开来,从而使得不同的团队或个人可以独立工作。这提高了网站的可维护性和协作效率。
  3. 增强网站可扩展性:主题交换机可以轻松地添加新的主题模板,从而使得网站可以随着业务需求变化而灵活调整。这可以增强网站的可扩展性和适应性。
  4. 支持多语言和多平台:通过主题交换机,可以为不同的语言和不同的平台提供相应的主题模板,从而满足不同用户群体的需求。
2.4.缺点
  1. 复杂性:实现一个功能完善的主题交换机可能需要较高的技术水平和开发成本。需要考虑到不同主题之间的兼容性、用户界面的一致性以及主题切换时可能引发的其他问题。
  2. 维护成本:每个主题都需要进行维护和更新,包括修复漏洞、添加新特性等。随着主题数量的增加,维护成本也会相应增加。
  3. 性能影响:主题交换机会增加系统的复杂性,可能对性能产生一定的影响。在切换主题时,系统可能需要重新加载资源或重新渲染页面,导致响应时间延长。
  4. 用户体验一致性:不同主题之间的布局、样式和交互方式可能存在差异,这可能导致用户在切换主题时感受到不连贯或不习惯的界面变化。
  5. 兼容性问题:某些插件、扩展或自定义功能可能与某些主题不兼容,导致功能故障或显示异常。
  6. 安全性考虑:主题交换机可能会增加系统的安全风险。如果没有妥善处理用户输入和主题代码的安全性,可能会导致潜在的安全漏洞,如跨站脚本攻击(XSS)等。
2.5.应用场景
  1. 物联网应用:主题交换机常用于物联网应用中,如智能家居、智能工厂、智能城市等。在这些应用中,大量的传感器和设备需要与云端或其他设备进行通信,主题交换机可以根据主题订阅将信息精确地发送到对应的设备上,实现精细化的数据管理和控制。
  2. 金融行业:主题交换机在金融行业中也得到广泛应用。在股票交易、期货交易等高频交易场景中,需要快速地将数据传递给相关的系统或者客户端。主题交换机可以按照主题订阅将数据精确地发送到目标设备上,提高交易效率和准确性。
  3. 实时数据分析:主题交换机可以用于实时数据分析和处理场景中。在大数据分析、人工智能、机器学习等应用中,需要快速地将数据传递给相应的处理节点,以实现实时分析和决策。主题交换机可以根据主题订阅将数据精确地发送到目标处理节点上,提高数据处理和分析效率。
  4. 云计算应用:主题交换机也常用于云计算应用中。在云计算环境中,多个虚拟机需要共享网络资源,主题交换机可以按照主题订阅将数据包送到相应的虚拟机上,实现网络资源的分配和共享,同时降低资源冲突和干扰。
  5. 实时通信:主题交换机还可以用于实时通信场景中,如在线游戏、视频会议等。在这些应用中,需要实时地传递数据以保证用户体验。主题交换机可以根据主题订阅将数据精确地发送到目标设备上,提高通信质量和稳定性。

3. 扇形交换机(Fanout exchange)

3.1 基本概述

扇形交换机是最基本的交换机类型,它的作用是广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要思考,所以扇形交换机处理消息的速度也是所有交换机类型里面最快的。

3.2.特点
  • 路由键无关: 扇形交换机不关心消息的路由键,只关心有多少个队列与其绑定。
  • 消息广播: 消息被广播到所有绑定的队列,是一种一对多的消息传递方式。
  • 快速广播: 扇形交换机的消息转发速度很快,适合需要快速广播消息的场景。
3.3.应用场景
  • 广播消息的场景: 适用于需要将消息广播给所有关联队列的情况,比如群聊功能、实时更新通知等。
  • 群聊功能: 在群聊中,扇形交换机能够将一条消息发送给所有群成员,实现消息的即时广播。

4.  首部交换机(Headers exchange)

4.1 基本概述

首部交换机是一种特殊的交换机类型,它不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。在绑定队列和交换器时,可以制定一组键值对。当发送消息到交换器时,RabbitMQ会获取到该消息的headers(也是一个键值对的形式),并对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对。如果完全匹配,则消息会路由到该队列,否则不会路由到该队列。

4.2 特点

首部交换机的特点主要包括以下几点:

基于headers属性匹配:首部交换机根据发送的消息内容中的headers属性进行匹配,而不是依赖于路由键的匹配规则。
性能较差:由于需要对比消息的headers属性与队列和交换器绑定时指定的键值对,因此首部交换机的性能会比较差,且不实用。
无法看到实际应用:在实际应用中,很少看到首部交换机的存在。

4.3 应用场景

首部交换机的应用场景较少,主要是用于某些特殊场景,例如企业网络、商务大厦网络、酒店宽带网络等。在这些场景中,可能需要实现数据的传输和交换,并且需要支持带宽控制、流量管理、VLAN等功能。但是,由于首部交换机的性能较差,且不实用,因此在实际应用中并不常见。

5. 默认交换机

5.1 基本概述

默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处,那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

举个例子,当你声明了一个名为"search-indexing-online"的队列,AMQP代理会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为"search-indexing-online"。换句话说,默认交换机看起来貌似能够直接将消息投递给队列,尽管技术上并没有做相关的操作。

6. 死信交换机

6.1 基本概述

死信交换机是一种特殊的交换机,用于接收和路由成为死信的消息。当消息成为死信后,会被发送到死信交换机,并通过该交换机的路由规则,将消息路由到指定的死信队列中进行处理。

当队列中的消息满足以下情况之一时,可以成为死信:

  • 消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置成了false。
  • 消息是一个过期消息,超时无人消费。
  • 要投递的队列消息满了,最新进来的消息变成死信。

如果这个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到交换机中,而这个交换机就被称为死信交换机(Dead Letter Exchange)。

死信交换机可以用于收集所有消费者处理失败的消息(死信),交由人工处理,进一步提高消息队列的可靠性

三、三大常用交换机案例讲解

1.直连交换机direct

工作模式图解

生产者发送的消息;交换机会根据不同的路由键,发送到对应的队列;

MQ配置类,声明交换机、队列,路由键绑定

/**
 * 声明交换机、队列、路由键绑定
 * /
@Configuration
puvlic class RabbitConfig {
	/**
	 * 创建直连交换机
	 */
	@Bean
	public DirectExchange createExchange() {
	    // 交换机名字;是否持久化;是否自动删除
		return new DirectExchange("testE", true, false);
	}
	/**
	 * 创建队列
	 */
	@Bean
	public Queue createQueue() {
	    // 交换机名字;是否持久化;是否自动删除
		return new Queue ("testQ", true, false, false);
	}
	/**
	 * 通过路由键绑定交换机和队列
	 */
	@Bean
	public Binding createBinding() {
	    // 交换机名字;是否持久化;是否自动删除
		return BindingBuilder
		.bind(this.createQueue())
		.to(this.createExchange())
		.with("testR");
	}
}

生产者

/**
 * 消息生产者
 */
@Service
public class ProduceMsg {
	@Autowire
	private RabbitTemplate rabbitTemplate;
	public void sendMsg(Object msg){
		// 消息唯一标识
	 	CorrelationData correlationData= new CorrelationData();
	 	correlationData.setId(msg.getId());
		rabbitTemplate.converAndSend("testE", "testR", msg, correlationData);
	}
}

消费者

@Conponent
public class ConsumeMsg {
	/**
	 * 消费者监听队列
	 */
	@RabbitListener(queues = "testQ")
	public void sendMsg(String msg){
		log.info("接收到消息:{}", msg);
		// ......业务逻辑消费消息;
	}
}

2.主题交换机Topic

topic模式跟direct的区别是,topic模式可以用通配符的方式,对路由键进行绑定;达到更灵活路由消息的效果。
交换机的routingKey不能随意写;必须是以点号分隔;如aa.bb; cc.dd.ee等形式
*号代表一个单词;#号代表0个或多个单词

工作模式图解

图中队列1绑定的路由键是 *.*.routeA
图中队列2绑定的路由键是 routeA.#
生产者向该交换机的routeA.xxx.routeA路由键发送消息;那么队列1和2都会收到消息


MQ配置类,声明交换机、队列,绑定


@Configuration
public class TopicRabbitMqConfig
{
    /**
     * 队列A
     */
    @Bean
    public Queue topicQueueA() {
        return new Queue("topic_queue_A", true, false, false);
    }
 
    /**
     * 队列B
     */
    @Bean
    public Queue topicQueueB() {
        return new Queue("topic_queue_B", true, false, false);
    }
 
    /**
     * Topic交换器
     */
    @Bean
    TopicExchange exchange() {
        return new TopicExchange("topic_exchange", true, false);
    }
 
    /**
     * 绑定A
     */
    @Bean
    Binding bindingExchangeQueueA() {
        //将队列和交换机绑定, 并设置用于匹配键:routingKey
        return BindingBuilder.bind(topicQueueA()).to(exchange()).with("*.*.routeKey");
    }
 
    /**
     * 绑定B
     */
    @Bean
    Binding bindingExchangeQueueB(Queue topicQueueB, TopicExchange exchange) {
        //将队列和交换机绑定, 并设置用于匹配键:routingKey
        return BindingBuilder.bind(topicQueueB()).to(exchange()).with("routeKey.#");
    }
}

生产者

/**
 * 消息生产者
 */
@Service
public class ProduceMsg {
	@Autowire
	private RabbitTemplate rabbitTemplate;
	public void sendMsg(Object msg){
		// 消息唯一标识
	 	CorrelationData correlationData= new CorrelationData();
	 	correlationData.setId(msg.getId());
		rabbitTemplate.converAndSend("topic_exchange", "routeKey.test.routeKey", 
	
	msg, correlationData);
	}
}

这个生产者发送的消息;队列topic_queue_A和topic_queue_B都会接收到该生产者发送的消息

3.扇出交换机Fanout

工作模式图解

生产者发送到交换机的消息;会发送到绑定到该交换机的所有队列

MQ配置类,声明交换机、队列,绑定

/**
 * RabbitMQ配置类
 */
@Configuration
public class RabbitMqConfig {
    @Bean
    public Queue fanoutQueueA()
    {
        return new Queue("queueA", true, false, false);
    }
 
    @Bean
    public Queue fanoutQueueB()
    {
        return new Queue("queueB", true, false, false);
    }
 
    @Bean
    public Queue fanoutQueueC()
    {
        return new Queue("queueC", true, false, false);
    }
 
    @Bean
    FanoutExchange fanoutExchange()
    {
        return new FanoutExchange("exchangeFanout");


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/ad06c20570b7810439f80d3dc8a6eec6.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**


        return new Queue("queueC", true, false, false);
    }
 
    @Bean
    FanoutExchange fanoutExchange()
    {
        return new FanoutExchange("exchangeFanout");


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-hsNZ0DCW-1713320303424)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值