目录
[二、 交换机类型讲解](#二、 交换机类型讲解)
[1. 直连交换机(Direct exchange)](#1. 直连交换机(Direct exchange))
[1.1 基本概述](#1.1 基本概述)
[2. 主题交换机(Topic exchange)](#2. 主题交换机(Topic exchange))
[2.1 基本概述](#2.1 基本概述)
[3. 扇形交换机(Fanout exchange)](#3. 扇形交换机(Fanout exchange))
[3.1 基本概述](#3.1 基本概述)
[4. 首部交换机(Headers exchange)](#4. 首部交换机(Headers exchange))
[4.1 基本概述](#4.1 基本概述)
[4.2 特点](#4.2 特点)
[4.3 应用场景](#4.3 应用场景)
[5. 默认交换机](#5. 默认交换机)
[5.1 基本概述](#5.1 基本概述)
[6. 死信交换机](#6. 死信交换机)
[6.1 基本概述](#6.1 基本概述)
前言
交换机(Exchange)是RabbitMQ中重要的概念之一,用于接收生产者发送的消息,并根据一定的规则将消息路由到相应的队列中。本文将详细介绍交换机的定义、作用、应用场景以及常见的交换机类型。
一、交换机的简介
1.什么是交换机
交换机是计算机网络中的一种设备,用于连接多个计算机或其他网络设备,并根据目标设备的MAC地址将数据包从一个接口转发到另一个接口。它可以在局域网内部实现数据包的转发和通信功能,使得多台计算机能够快速、可靠地进行数据传输和交流。交换机是实现局域网的重要组成部分,被广泛应用于各种网络环境,包括家庭、办公室、数据中心等。
其中包含两个关键组件:
路由键:生产者将消息发送给交换机的时候,会指定RoutingKey指定路由的规则。
绑定键:通过绑定键将交换机与队列关联起来,这样RabbitMQ就知道如何正确地将消息路由到队列。
2.交换机的作用
-
数据包的转发:交换机根据数据包中的目标MAC地址,将数据包从一个接口转发到另一个接口。这样可以实现设备之间的直接通信,提高网络传输效率。
-
广播和多播的支持:交换机可以将广播和多播数据包发送到所有连接的设备,使得设备能够接收共享的信息或者数据流。
-
网络分割和隔离:通过将网络划分为不同的虚拟局域网(VLAN),交换机可以将不同的设备分隔开来,实现网络资源的隔离和安全性的提高。
-
增强网络安全:交换机可以基于MAC地址、IP地址、端口等信息进行访问控制和策略限制,保护网络免受未经授权的访问和攻击。
-
提供带宽管理和质量 of 服务(QoS)支持:交换机可以根据不同的流量需求对数据包进行优先级和带宽分配,确保关键应用程序的传输质量。
3.交换机的应用场景
-
局域网(LAN):交换机是局域网中的重要组成部分,它可以连接多台计算机、服务器、打印机等设备,并提供高速、可靠的数据传输。在企业、学校、医院等各种网络环境中,交换机都是必不可少的设备。
-
数据中心:在大型数据中心中,交换机能够连接数以千计的服务器和存储设备,实现数据中心内部的高效通信和管理。通过使用高级功能如VLAN、QoS、多路径路由等,交换机可以提供更高的性能和可靠性。
-
云计算:随着云计算技术的发展,交换机成为了云计算基础设施的重要组成部分。它可以连接云服务器、虚拟机和存储设备,实现云计算资源的高效、安全地管理和分配。
-
视频监控:在视频监控系统中,交换机可以连接多台摄像机和监视器,实现视频流的传输和管理。通过使用高带宽交换机和质量 of 服务(QoS)技术,可以保证视频监控系统的稳定性和可靠性。
二、 交换机类型讲解
1. 直连交换机(Direct exchange)
1.1 基本概述
直连交换机的路由算法非常简单:将消息推送到binding key与该消息的routing key相同的队列。
直连交换机的绑定了两个队列。第一个队列绑定了orange,第二个队列绑定了两个绑定键:black和green。在这种场景下,一个消息在发布消息时指定了orange将只能被队列Q1接收, 在发布消息时指定了black和green将只能被队列Q2接收, 其他消息将丢失。
同一个绑定键可以绑定到不同的队列上去,可以增加一个交换机X与队列Q2的绑定键,在这种情况下,直连交换机和广播交换机有着相同的行为,将消息推送到所有的匹配队列上。(如下图)
1.2.特点
-
简便性:直连交换机部署简单,只需要将设备通过网线插入交换机的不同端口上即可实现设备之间的通信和数据传输。这种方式比使用集线器或路由器进行局域网连接更加方便。
-
高效性:直连交换机能够提供高速的数据传输和转发能力,可以满足大多数用户的需求。与集线器相比,它更能支持多种传输速率和协议,并且能够根据MAC地址进行数据包的转发,提高了数据传输的效率。
-
稳定性:直连交换机有较好的稳定性,可以保证设备之间的通信质量和网络的稳定性。这种方式相比于使用路由器进行连接,可以避免路由器故障对整个网络的影响。
-
可扩展性:直连交换机可以通过增加端口数量来扩展网络容量,实现更多设备之间的通信和数据传输。通过连接多个交换机,可以构建更大规模的局域网。
1.3.缺点
-
端口数量有限:直连交换机通常具有有限的端口数量,这意味着它只能支持连接有限数量的设备。如果需要连接更多设备,就需要使用更大规模的交换机或者采用其他解决方案。
-
扩展性受限:由于直连交换机的端口数量有限,当需要扩展局域网并连接更多设备时,可能需要更换或升级交换机,这可能会带来额外的成本和配置工作。
-
单点故障:如果直连交换机发生故障,连接到该交换机上的所有设备都可能会受到影响,导致整个局域网中的通信中断。为了避免单点故障,可以考虑使用冗余交换机或者采用其他冗余设计。
-
限制广播域:直连交换机会限制广播域的范围。广播是网络中发送给所有设备的消息,当网络中的设备数量增加时,广播消息也会增加,可能会导致网络性能下降。为了解决这个问题,可以使用虚拟局域网(VLAN)或者更高级别的交换机。
-
可管理性有限:直连交换机通常提供有限的管理功能,无法提供像更高级别交换机那样的丰富功能和灵活性。这可能会限制网络管理员对交换机的配置和监控能力。
1.4.应用场景
-
数据中心服务器连接:直连交换机常用于连接数据中心中的服务器和存储设备,提供高带宽、低延迟的连接方式。这种方式可以满足对数据传输速度和响应时间要求较高的应用,如大规模数据处理、云计算等。
-
聚合链路:直连交换机可以用于将多个主机设备通过高速链路聚合成一个逻辑链路,以提供更大的带宽和冗余。通过聚合链路,可以实现负载均衡和故障切换,提高网络的可靠性和性能。
-
服务器虚拟化:直连交换机广泛应用于服务器虚拟化环境中。在虚拟化环境中,多个虚拟机需要共享物理服务器的网络资源,直连交换机可以为每个虚拟机提供独立的高速网络连接,确保虚拟机之间和与外部网络的通信效率和安全性。
-
存储网络连接:直连交换机也可用于连接存储设备,如SAN(存储区域网络)或NAS(网络附加存储)。这种连接方式可以提供高带宽、低延迟的存储访问,满足对存储性能要求较高的应用,如数据库、视频编辑等。
-
高性能计算:直连交换机常用于高性能计算领域,如科学计算、天气预报、金融模型等。通过直连交换机提供的高带宽、低延迟连接,可以加速数据传输和处理,提高计算效率和响应时间。
2. 主题交换机(Topic exchange)
2.1 基本概述
主题交换机(Topic Exchange)是一种消息队列的交换机类型,它通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种发布/订阅模式及其变种,通常用来实现消息的多播路由。
2.2.包含的组件
-
主题目录:存放不同主题模板的文件夹。每个主题目录都包含一组页面模板、样式表和其他相关资源。
-
主题管理器:提供主题预览、选择和安装等功能的界面。用户可以通过主题管理器选择合适的主题,并且可以在后台进行安装和升级。
-
主题切换器:用于在不同主题之间切换的接口。主题切换器可以是一个下拉菜单、按钮或者其他交互元素,用于触发主题切换操作。
-
主题引擎:负责将用户请求映射到相应的主题模板,并将数据填充到模板中生成最终的 HTML 页面。主题引擎通常会使用模板语言来支持动态内容的渲染。
2.3.优点
-
提供多样化的用户体验:通过主题交换机,用户可以自由选择不同的主题,从而获得不同的视觉和使用体验。这可以提高产品的吸引力和用户满意度。
-
提高网站可维护性:主题交换机可以将页面设计和内容分离开来,从而使得不同的团队或个人可以独立工作。这提高了网站的可维护性和协作效率。
-
增强网站可扩展性:主题交换机可以轻松地添加新的主题模板,从而使得网站可以随着业务需求变化而灵活调整。这可以增强网站的可扩展性和适应性。
-
支持多语言和多平台:通过主题交换机,可以为不同的语言和不同的平台提供相应的主题模板,从而满足不同用户群体的需求。
2.4.缺点
-
复杂性:实现一个功能完善的主题交换机可能需要较高的技术水平和开发成本。需要考虑到不同主题之间的兼容性、用户界面的一致性以及主题切换时可能引发的其他问题。
-
维护成本:每个主题都需要进行维护和更新,包括修复漏洞、添加新特性等。随着主题数量的增加,维护成本也会相应增加。
-
性能影响:主题交换机会增加系统的复杂性,可能对性能产生一定的影响。在切换主题时,系统可能需要重新加载资源或重新渲染页面,导致响应时间延长。
-
用户体验一致性:不同主题之间的布局、样式和交互方式可能存在差异,这可能导致用户在切换主题时感受到不连贯或不习惯的界面变化。
-
兼容性问题:某些插件、扩展或自定义功能可能与某些主题不兼容,导致功能故障或显示异常。
-
安全性考虑:主题交换机可能会增加系统的安全风险。如果没有妥善处理用户输入和主题代码的安全性,可能会导致潜在的安全漏洞,如跨站脚本攻击(XSS)等。
2.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");
}
@Bean
Binding bindingExchangeA()
{
return BindingBuilder.bind(fanoutQueueA()).to(fanoutExchange());
}
@Bean
Binding bindingExchangeB()
{
return BindingBuilder.bind(fanoutQueueB()).to(fanoutExchange());
}
@Bean
Binding bindingExchangeC()
{
return BindingBuilder.bind(fanoutQueueC()).to(fanoutExchange());
}
}
生产者
/**
* 消息生产者
*/
@Service
public class ProduceMsg {
@Autowire
private RabbitTemplate rabbitTemplate;
public void sendMsg(Object msg){
// 消息唯一标识
CorrelationData correlationData= new CorrelationData();
correlationData.setId(msg.getId());
rabbitTemplate.converAndSend("exchangeFanout", "", msg, correlationData);
}
}
消费者
@Conponent
public class ConsumeMsg {
/**
* 消费者监听队列
*/
@RabbitListener(queues = "testQ")
public void sendMsg(String msg){
log.info("接收到消息:{}", msg);
// ......业务逻辑消费消息;
}
}
总结
网络交换机是计算机网络中的重要组成部分之一,用于连接多个设备并使它们可以相互通信。常见的交换机类型包括以太网交换机、路由器、主题交换机等。
以太网交换机是最基础、最常见的交换机类型,它能够检查数据包的目的MAC地址,并将数据包转发给对应的端口,从而实现局域网内的通信。路由器则负责在不同网络之间进行数据包转发,通过IP地址寻址实现网络间的通信。