深入学习RabbitMQ的Direct Exchange(直连交换机)
RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例,帮助读者更好地理解和使用这一消息传递模式。
一、Direct Exchange的原理
Direct Exchange是RabbitMQ中最简单的消息交换机类型之一。它根据消息的路由键(Routing Key)将消息路由到与之匹配的队列中。每个队列在绑定到交换机时,都会指定一个或多个绑定键(Binding Key)。当消息发送到交换机时,交换机将消息的路由键与所有绑定键进行匹配,并将消息路由到所有匹配成功的队列中。
- 消息发送:生产者将消息发送到Direct Exchange时,需要指定一个路由键。
- 绑定关系:队列与交换机之间的绑定关系是通过绑定键建立的。每个队列可以绑定到多个交换机,每个交换机也可以绑定多个队列。
- 消息路由:交换机根据消息的路由键和队列的绑定键进行匹配,将消息路由到所有匹配成功的队列中。
二、Direct Exchange的应用场景
Direct Exchange适用于需要精确匹配路由键的场景,特别是在一对一或多对一的消息传递中表现出色。以下是一些典型的应用场景:
- 日志处理:根据日志的级别或类型,将日志消息路由到不同的处理队列中。例如,可以将ERROR级别的日志路由到一个错误处理队列,将INFO级别的日志路由到一个信息处理队列。
- 任务分发:在任务分发系统中,可以将不同的任务分配给不同的处理队列,每个队列对应一个或多个消费者。这样可以实现任务的并行处理和负载均衡。
- 订单处理:在电商系统中,根据订单号将订单消息路由到特定的处理队列,以便进行后续的订单处理流程。这可以确保每个订单都被正确地处理和跟踪。
- 消息过滤:在某些情况下,可能需要根据消息的某些属性进行过滤,将符合条件的消息路由到特定的队列中。Direct Exchange可以通过精确匹配路由键来实现这一功能。
三、Direct Exchange的配置方法
在RabbitMQ中配置Direct Exchange通常涉及以下几个步骤:
- 声明交换机:使用RabbitMQ的API或管理界面声明一个Direct Exchange。
- 绑定队列:将队列与Direct Exchange绑定,并指定绑定键。这个绑定键将用于匹配消息的路由键。
- 发送消息:生产者发送消息到Direct Exchange时,需要指定一个路由键。交换机将根据这个路由键来查找与之匹配的队列。
- 接收消息:消费者从绑定的队列中接收消息进行处理。
四、实践案例
以下是一个使用Spring AMQP和RabbitMQ实现Direct Exchange的示例案例。这个案例将展示如何配置交换机、队列、绑定关系以及发送和接收消息。
1. 配置交换机和队列
首先,需要在RabbitMQ中声明一个Direct Exchange和一个或多个队列。这里我们使用Spring AMQP的Java配置方式来实现。
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {public static final String EXCHANGE_NAME = "direct_exchange";public static final String QUEUE_NAME_ONE = "queue_one";public static final String QUEUE_NAME_TWO = "queue_two";public static final String ROUTING_KEY_ONE = "routing_key_one";public static final String ROUTING_KEY_TWO = "routing_key_two";@Beanpublic Queue queueOne() {return new Queue(QUEUE_NAME_ONE, true);}@Beanpublic Queue queueTwo() {return new Queue(QUEUE_NAME_TWO, true);}@Beanpublic DirectExchange directExchange() {return new DirectExchange(EXCHANGE_NAME);}@Beanpublic Binding bindingOne(Queue queueOne, DirectExchange directExchange) {return BindingBuilder.bind(queueOne).to(directExchange).with(ROUTING_KEY_ONE);}@Beanpublic Binding bindingTwo(Queue queueTwo, DirectExchange directExchange) {return BindingBuilder.bind(queueTwo).to(directExchange).with(ROUTING_KEY_TWO);}
}
2. 发送消息
接下来,我们编写一个生产者类来发送消息到Direct Exchange。
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MessageProducer {@Autowiredprivate AmqpTemplate amqpTemplate;public void sendMessage(String routingKey, String message) {amqpTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, routingKey, message);}
}
3. 接收消息
最后,我们编写一个消费者类来接收消息并处理。
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageConsumer {@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME_ONE)public void receiveMessageFromQueueOne(String message) {System.out.println("Received message from queue one: " + message);}@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME_TWO)public void receiveMessageFromQueueTwo(String message) {System.out.println("Received message from queue two: " + message);}
}
4. 运行案例
现在,我们可以运行这个Spring Boot应用程序,并使用MessageProducer来发送消息。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class ApplicationRunner implements CommandLineRunner {@Autowiredprivate MessageProducer messageProducer;@Overridepublic void run(String... args) throws Exception {messageProducer.sendMessage(RabbitMQConfig.ROUTING_KEY_ONE, "Hello, queue one!");messageProducer.sendMessage(RabbitMQConfig.ROUTING_KEY_TWO, "Hello, queue two!");}
}
当应用程序运行时,它会发送两条消息到Direct Exchange。第一条消息将使用routing_key_one作为路由键,因此将被路由到queue_one。第二条消息将使用routing_key_two作为路由键,因此将被路由到queue_two。消费者类将分别接收并处理这两条消息。
总结
Direct Exchange是RabbitMQ中最简单且常用的消息交换机类型之一。它通过精确匹配路由键将消息路由到与之匹配的队列中。本文深入介绍了Direct Exchange的原理、应用场景、配置方法以及实践案例。通过本文的学习,读者可以更好地理解和使用Direct Exchange来实现消息传递和分发功能。在实际应用中,可以根据具体需求选择合适的消息交换机类型来构建高效、可靠的消息传递系统。
相关文章:
深入学习RabbitMQ的Direct Exchange(直连交换机)
RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例&a…...
HTML实战课堂之启动动画弹窗
一:代码片段讲解 小提示:下面是一个包含启动页和弹窗的完整示例。这个示例包括一个简单的启动页和一个弹窗,当用户点击启动页上的按钮时,会显示弹窗。 1. **HTML结构**: - #startPage:启动页,包…...
将本地的 Git 仓库上传到 GitHub 上(github没有该仓库)
文章目录 步骤 1:在 GitHub 上创建新仓库步骤 2:配置本地仓库步骤 3:添加远程仓库地址步骤 4:推送本地代码到 GitHub验证上传 步骤 1:在 GitHub 上创建新仓库 登录 GitHub: 打开浏览器并访问 GitHub。使用自…...
【Linux】模拟Shell命令行解释器
一、知识补充 1.1 snprintf snprintf() 是 C语言的一个标准库函数,定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串,并将结果存储在指定的字符数组中。该函数的原型如下: int snprintf(char *str, size_t size, con…...
G-Star Landscape 2.0 重磅发布,助力开源生态再升级
近日,备受行业瞩目的 G-Star Landscape 迎来了其 2.0 版本的发布,这一成果标志着 GitCode 在开源生态建设方面又取得了重要进展。 G-Star Landscape仓库链接: https://gitcode.com/GitCode-official-team/G-Star-landscape 2024 GitCode 开…...
Lianwei 安全周报|2024.1.7
以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 国家发改委等三部门印发《国家数据基础设施建设指引》 国家数据基础设施是从数据…...
ASP.NET Core 实现微服务 - Consul 配置中心
这一次我们继续介绍微服务相关组件配置中心的使用方法。本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来。因为前面我们已经介绍了使用Consul 做为服务注册发现的组件 ,那么干脆继续使用 Consul 来作为配置…...
使用redis的5种常用场景
文章目录 1. 缓存热点数据2. 分布式锁3. 计数器和限流器4. 消息队列5. 会话管理总结 在日常开发工作中,Redis作为一款高性能的内存数据库,凭借其强大的功能特性和卓越的性能表现,已经成为了许多项目中不可或缺的组件。本文将详细介绍Redis在实…...
微信小程序防止重复点击事件
直接写在app.wpy里面,全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…...
PySpark用sort-merge join解决数据倾斜的完整案例
假设有两个大表 table1 和 table2 ,并通过 sort-merge join 来解决可能的数据倾斜问题。 from pyspark.sql import SparkSession from pyspark.sql.functions import col# 初始化SparkSession spark SparkSession.builder.appName("SortMergeJoinExample&quo…...
sklearn-逻辑回归-制作评分卡
目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线,判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中,评分卡是…...
scrapy爬取图片
scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架,专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括: 高效的抓取性能:Scrapy 采用了异步机制,能够高效…...
在 Vue 项目中使用地区级联选
在 Vue 项目中使用地区级联选择的完整流程: 1.安装依赖包,这个包提供了中国省市区的完整数据。 npm install element-china-area-data --save 2.导入数据 import { regionData } from element-china-area-data 这个包提供了几种不同的数据格式&#…...
【简博士统计学习方法】第1章:1. 统计学习的定义与分类
自用笔记 1. 统计学习的定义与分类 1.1 统计学习的概念 统计学习(Statistical Machine Learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 以计算机和网络为平台;以数据为研究对象;以…...
利用 Python 脚本批量创建空白 Markdown 笔记
文章目录 利用 Python 脚本批量创建空白 Markdown 笔记1 背景介绍2 需求描述3 明确思路4 具体实现4.1. 遍历 toc.md 文件,收集文件名和对应的文件内容4.2. 实现文件批量生成逻辑4.3. 补全缺失的工具函数4.4. 进一步补全工具函数中的工具函数 5 脚本运行6 注意事项 利…...
【Qt】C++11 Lambda表达式
1. 举例 connect(ui->pushButton, &QPushButton::clicked, [](bool checked){//具体代码qDebug() << "Hello" << checked;}); 2. 详情 //完整形式 [ capture ] ( params ) opt -> ret { body; }; capture 是捕获列表params 是参数表opt 是函数…...
怎样提高服务器中的数据传输速度?
服务器中的数据传输速度会影响着用户的体验感,当企业中的数据传输速度出现卡顿或者是过慢时,用户不能及时浏览到所需的内容,给用户造成不好的体验感,那么企业该怎样才能提高服务器中的数据传输速度呢? 服务器之间如何传…...
Vue 封装公告滚动
文章目录 需求分析1. 创建公告组件Notice.vue2. 注册全局组件3. 使用 需求 系统中需要有一个公告展示,且这个公告位于页面上方,每个页面都要看到 分析 1. 创建公告组件Notice.vue 第一种 在你的项目的合适组件目录下(比如components目录&a…...
JVM实战—12.OOM的定位和解决
大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…...
【python翻译软件V1.0】
如果不想使用密钥的形式,且需要一个直接可用的中英文翻译功能,可以使用一些免费的公共 API,如 opencc 或其他无需密钥的库,或直接用 requests 获取翻译结果。 其中,我可以给你一个简单的代码示例,使用 tra…...
大子刊nc复现:连续介质中束缚态驱动下的平面手征超表面,展示最大和可调谐的三次谐波、本征手性B...
comsol三次谐波,本征手性BIC,远场偏振图,手性透射曲线,二维能带图,Q因子图,电场图,所见即所得 大子刊nc复现,在连续介质中束缚态驱动下具有最大和可调谐手征光学响应的平面手征超表面今天咱们来…...
基于Python的毕业生实习管理系统
项目介绍:基于Python的毕业生实习管理系统技术栈 项目编号:本课题采用 Python 语言进行开发,系统整体基于 Web 平台实现。前端页面主要使用 HTML、CSS、JavaScript 进行构建,并结合 Bootstrap 提升页面布局与交互效果;…...
Matlab Simulink四分之一主动悬架:PID与模糊PID控制器在车身加速度上的对比研究
项目:Matlab Simulink四分之一主动悬架,针对车身加速度的PID和模糊Pid控制器对比 详情:根据汽车的半主动悬架系统,通过Simulink建立二自由度1/4车辆简化模型以及路面激励模型,以车身垂直加速度为控制对象,悬…...
Unity URP SRP Batcher 完全指南 URP/HDRP 下的核心批处理机制,大幅降低 CPU 开销
SRP Batcher 是 Unity Scriptable Render Pipeline (SRP) 的核心优化技术,通过减少 CPU 与 GPU 之间的数据传输开销,显著提升渲染性能。本文将深入解析其工作原理、使用方法及最佳实践。一、什么是 SRP BatcherSRP Batcher 是 Unity 为 Scriptable Rende…...
企业AI应用开发:从零构建企业级AI智能体的全流程指南
一文讲透智能体开发的核心要素,让AI真正融入业务系统随着大模型技术的成熟,AI智能体正从概念走向企业核心业务。对于信息中心和软件开发团队而言,如何低成本、高效率地将AI能力嵌入业务流程,已成为技术选型的核心考量。本文将系统…...
2026年专业深度测评:超强增压花洒套装排名前五权威榜单
一、开篇:行业趋势与测评声明随着消费者对居家生活品质要求的精细化提升,以及高层住宅、老旧小区水压不稳问题的普遍存在,具备稳定出水与舒适沐浴体验的超强增压花洒套装已成为市场核心需求。为帮助消费者在众多产品中做出科学决策࿰…...
CLI为什么突然爆了?一文讲清 Skill、MCP、CLI 的真实关系
导读最近可以明显看到一个变化:钉钉、飞书、企业微信,开始陆续开放 CLI 能力 越来越多团队,不再只讨论提示词,而是在做一件更实际的事:让 AI 直接参与执行很多人开始有几个共通疑问:CLI 到底是什么Skill 和…...
【ASTM D4169】之穿梭机器人,仓储机器人,托盘四向穿梭机器人的包装运输安全验证守法
穿梭机器人(通常指托盘四向穿梭车、智能物流机器人)的包装验证,核心目标是确保其在经历长途运输、仓储周转、装卸搬运后,机械结构、电子元器件和功能性能保持完好。 穿梭机器人的包装验证体系相对复杂,因为它既是运输…...
山西口碑好的实体店获客公司哪家可靠
在山西,实体店主们都在为如何有效获客而烦恼。随着市场竞争的加剧,选择一家可靠的获客公司至关重要。今天,我们就来探讨一下山西口碑好的实体店获客公司,重点介绍中谷云(厦门)大数据科技有限公司࿰…...
风冷机房温湿度数据采集解决方案
对部分气候干旱的地区来说,使用风冷技术对数据机房进行冷却是比较合适的方案,但高能耗问题仍需要避免与管控,要求环境温湿度与散热效率进行合理分配。对此,物通博联提供温湿度数据采集到机房管理平台的解决方案。 需求如下 温湿度…...
