当前位置: 首页 > news >正文

RabbitMQ系列学习笔记(九)--路由模式

文章目录

  • 一、路由模式原理
  • 二、多重绑定
  • 三、路由模式实战
    • 1、消费者代码
    • 2、生产者代码
    • 3、运行结果分析

本文参考
尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq
RabbitMQ 详解
Centos7环境安装Erlang、RabbitMQ详细过程(配图)

一、路由模式原理

image.png
使用发布订阅模式时,所有消息都会发送到绑定的队列中,但很多时候,不是所有消息都要无差别的发布到所有队列中。比如,我们希望将日志消息写入磁盘的程序仅接收严重错误(errros),而不存储那些警告(warning)或信息(info)日志消息以避免浪费磁盘空间。Fanout这种交换类型并不能给我们带来很大的灵活性-它只能进行无意识的广播,此时就需要使用路由模式 (Routing)完成这一需求。其特点如下:

  • 每个队列绑定路由关键字 RoutingKey
  • 生产者将带有 RoutingKey 的消息发送给交换机,交换机根据 RoutingKey 转发到指定队列。
  • 路由模式使用 direct 交换机

回顾bindings的概念,绑定是交换机和队列之间的桥梁关系。也可以这么理解:队列只对它绑定的交换机的消息感兴趣。绑定用参数:routingKey来表示也可称该参数为binding key,创建绑定我们用代码:channel.queueBind(queueName, EXCHANGE_NAME, "routingKey");
在上图实例中,可以看到交换机 X 绑定了两个队列,绑定类型是direct。队列Q1绑定键为orange,队列Q2绑定键有两个:一个绑定键为black,另一个绑定键为green。这说明即使是同一对交换机和队列也可以有多个routingKey
在这种绑定情况下,生产者发布消息到exchange上,绑定键为orange的消息会被发布到队列Q1。绑定键为black和green和的消息会被发布到队列Q2,其他消息类型的消息将被丢弃。

二、多重绑定

image.png

如果exchange的绑定类型是direct,但是它绑定的多个队列的key如果都相同,在这种情况下虽然绑定类型是direct但是它表现的就和fanout有点类似了,就跟广播差不多,如上图所示。

三、路由模式实战

image.png
根据以上对应关系进行代码编写,其中包括两个队列:disk和console,一个生产者,两个消费者,一个direct类型的交换,与disk队列通过error进行绑定,与console队列通过info和warning两个routingkey进行绑定。最终进行测试,查看结果。

1、消费者代码

同样的,代码整体逻辑与之前的案例没什么不同,只是交换机类型变更,以及需要指定routingkey参数。
消费者01代码如下:

/*** Description: 路由模式消费者01*/
public class ReceiveLogsDirect01 {//设置要创建的交换机的名称private static final String EXCHANGE_NAME = "direct_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();//创建fanout交换机/*** 参数1:交换机名* 参数2:交换机类型,本次设置为direct* 参数3:交换机是否持久化*/channel.exchangeDeclare(EXCHANGE_NAME, "direct", false);channel.queueDeclare("disk", false, false, false, null);//将交换机与队列进行绑定(binding)/*** 参数1:队列名* 参数2:交换机名* 参数3:路由关键字,发布订阅模式写""空串即可*/channel.queueBind("disk", EXCHANGE_NAME, "error");//接收消息channel.basicConsume("disk", true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("ReceiveLogsDirect01控制台打印接收到的消息: " + message);}});}
}

消费者02代码如下:

/*** Description: 路由模式消费者02*/
public class ReceiveLogsDirect02 {//设置要创建的交换机的名称private static final String EXCHANGE_NAME = "direct_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();channel.exchangeDeclare(EXCHANGE_NAME, "direct", false);channel.queueDeclare("console", false, false, false, null);//多重绑定channel.queueBind("console", EXCHANGE_NAME, "info");channel.queueBind("console", EXCHANGE_NAME, "warning");//接收消息channel.basicConsume("console", true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("ReceiveLogsDirect02控制台打印接收到的消息: " + message);}});}
}

2、生产者代码

/*** Description: 路由模式生产者*/
public class EmitLogDirect {//交换机名称private static final String EXCHANGE_NAME = "direct_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();//准备3条消息String message1 = "这是一条info信息";String message2 = "这是一条warning信息";String message3 = "这是一条error信息";channel.basicPublish(EXCHANGE_NAME, "info", null, message1.getBytes());channel.basicPublish(EXCHANGE_NAME, "warning", null, message2.getBytes());channel.basicPublish(EXCHANGE_NAME, "error", null, message3.getBytes());//关闭资源channel.close();}
}

3、运行结果分析

先将两个消费者运行,因为它们负责声明交换机创建队列以及绑定关系,再启动生产者发送消息,此时会看到message1和message2发给了ReceiveLogsDirect02,而message3发送给了ReceiveLogsDirect01
在此过程中,生产者在发送消息时指定了EXCHANGE_NAME,无论是什么消息都先发送给direct类型的交换机,它的名字设置为了direct_logs,然后交换机会根据routingkey的路由规则决定该消息转发给哪个队列,以及是否要丢弃。假如此时我们发送一个routingkey为debug的消息,交换机由于找不到转发目标会将该消息丢弃。

相关文章:

RabbitMQ系列学习笔记(九)--路由模式

文章目录 一、路由模式原理二、多重绑定三、路由模式实战1、消费者代码2、生产者代码3、运行结果分析 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、路由模式原理 使用发布订阅模式时&#x…...

[OS] pthreads-1

线程的基本概念 线程是进程中的一个单一的执行流。一个进程可以包含多个线程,这些线程共享进程中的资源,并且在相同的地址空间中执行。多线程是提高应用程序并行性的流行方法。例如,在浏览器中,不同的标签页可以视作独立的线程。…...

ThreeJS入门(137):THREE.StringKeyframeTrack 知识详解,示例代码

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas&#xf…...

用大模型或者向量模型比如huggingface上的模型,处理一批图片,对该图片进行分类,检索

要使用大模型或向量模型对图片进行分类和检索,通常可以采用以下几种方法: 1. **图像分类**:使用预训练的图像分类模型(如ResNet、EfficientNet等)对图片进行分类。 2. **图像特征提取**:使用预训练的模型(如CLIP、ResNet等)提取图像的特征向量,然后进行相似度检索。 …...

Mac 使用 zsh 终端提示 zsh: killed 的问题

我的脚本的内容为: #!/bin/bashset -epids$(ps -ef | grep consul | grep -v grep | awk {print $2})for pid in $pids; doecho "kill process: $pid"kill -9 $pid donecd $(dirname $0)nohup ./consul agent -dev > nohup.log &可以看到这是一个…...

数字后端零基础入门系列 | Innovus零基础LAB学习Day6

今天没有具体的数字IC后端lab实验。今天的重点是熟悉掌握静态时序分析STA中的几类timing path以及setup和hold检查机制(包含setup和hold计算公式)。 芯片流片失败的那些故事 数字后端零基础入门系列 | Innovus零基础LAB学习Day5 等大家把今天内容学习…...

(Linux驱动学习 -13).SPI驱动实验

目录 一.SPI驱动相关结构体与函数 1.struct spi_master 结构体 2.申请 spi_master - spi_alloc_master 3.释放 spi_master - spi_master_put 4.向内核注册 spi_master - spi_register_master 5.注销掉 spi_master 6.struct spi_driver 结构体 7.向内核注册 spi_driver -…...

Angular 框架入门教程:从安装到路由、服务与状态管理详解

一、引言 在前端开发领域,Angular 是一个强大且流行的框架。它由 Google 维护,基于 TypeScript,采用模块化设计,提供了组件化开发、依赖注入、路由、表单处理等丰富功能,旨在帮助开发者构建高效、可维护的单页应用程序…...

【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师

一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…...

oss 简单命令(已亲测)

1、 服务器本地文件复制到OSS指定目录 ./ossutil cp -r /opt/post/afc/afcServer/afcenter/logs/ oss://oss-name/ScBak/20230608/ -c /opt/post/ossconfig 2、在oss服务器上创建文件夹 ./ossutil mkdir oss://oss-name/ScBak/20230608/dam -c /opt/post/ossconfig 3、查…...

申请https证书

引入证书: 当服务器使用HTTPS之前都会申请一份证书,证书是为了证明服务端公钥的权威性,服务器向浏览器传输证书,浏览器再从证书里获取公钥,证书明文数据签名。 如何理解CA签发证书的过程 a.CA会有自己的公钥 和 私钥&#xff…...

trtexec 工具使用

本文介绍trtexec工具的使用,trtexec可以实现onnx模型导出trt模型、耗时分析和模型优化分析等功能,本节将对 trtexec的运用进行介绍。 1.trtexec trtexec是官方提供的命令行工具,主要用于一下三个方面 生成模型序列化文件:由ONNX文…...

10款具备强大数据报告功能的电脑监控工具,办公电脑怎么监控

数据报告功能是电脑监控软件的重要特性,它能够帮助管理者全面了解员工的工作行为、应用使用情况,并生成详细的生产力分析报告。以下是10款具备强大数据报告功能的监控工具推荐,帮助企业有效管理和提升工作效率。 1. 固信软件 固信软件不仅是…...

如何理解Linux中的进程名

目录 一:程序的概念二:进程的概念三:线程的概念四:Linux中的进程名 一:程序的概念 程序就是采用某种特定格式编写的文本文件,该文件可以给编译器或者解释器编译和解释。编写好的程序平时存放在硬盘中。 二…...

微信红包设计流程讲解与实战分析

#1024程序员节 | 征文# 前言 微信红包作为大家耳熟能详的一种互动方式,其背后的技术支持包含多个方面。从用户发出红包到红包被抢完,涉及到的流程包括发红包、红包存储、红包拆分以及抢红包等。本文将详细介绍这一系列流程,并通过代码案例来…...

AI智能体:AI智能体(Agent)是什么?为什么要学?99%的人不知道!

为什么要学? 我们先搞清楚为什么? 最近看到 AI 创新力五问,我们日常生活中有使用 AI 来融入到我们的学习工作流嘛? 值得我们日常反省。 未来企业人才招聘测试AI创新力的五问: 您是否处于每天习惯使用 AI 的状态&am…...

NVR小程序接入平台/设备EasyNVR多个NVR同时管理的高效解决方案

在当今的数字化安防时代,视频监控系统的需求日益复杂和多样化。为了满足不同场景下的监控需求,一种高效、灵活且兼容性强的安防视频监控平台——NVR批量管理软件/平台EasyNVR应运而生。本篇探讨这一融合所带来的创新与发展。 一、NVR监测软件/设备EasyNV…...

APS开源源码解读: 排程工具 optaplanner II

上篇 排产,原则上也就是分配时间,分配资源;保证资源日历约束,保证工艺路线约束。我们看一下如何实现optaplanner 优化的 定义一个move, 一个move可能改变了分配到的资源,也可能改变了一个资源上的顺序。改变即意味着优…...

科技是把双刃剑,巧用技术改变财务预测

数字化和全球化的双向驱动,引领我国各行各业在技术革新的浪潮中不断扬帆。这一趋势不仅带来了前所未有的突破与创新,推进企业迈向数据驱动决策的新未来,同时也伴随着一些潜在的问题和挑战。科技的普及就像是一场革命,在财务管理领…...

vscode默认添加python项目的源目录路径到执行环境(解决ModuleNotFoundError: No module named问题)

0. 问题描述 vscode中编写python脚本,导入工程目录下的其他模块,出现ModuleNotFoundError: No module named 错误 在test2的ccc.py文件中执行print(sys.path) 查看路径 返回结果发现并无’/home/xxx/first_demo’的路径,所以test2下面的文…...

避开这3个坑!MIPI走线设计如何减少对GSM信号的干扰(含阻抗匹配计算)

避开这3个坑!MIPI走线设计如何减少对GSM信号的干扰(含阻抗匹配计算) 在消费电子硬件设计中,MIPI接口与射频信号的共存问题一直是工程师面临的棘手挑战。特别是当设备需要同时支持高清显示和GSM通信功能时,MIPI信号对GS…...

XU9232A可穿戴设备 电池供电设备 便携式医疗设备

这是一款高度集成的升压转换器,为输出高电压和高效率的应用方案而设计。输入电源可以从一个锂电池或二节串联的碱性电池,而升压到最高18V;工作频率为 1.2MHz(典型值)。内置典型4A开关晶体管,其组成 DC/DC 升…...

5分钟搞定!Fun-ASR-MLT-Nano-2512多语言语音识别一键部署指南

5分钟搞定!Fun-ASR-MLT-Nano-2512多语言语音识别一键部署指南 1. 快速了解Fun-ASR-MLT-Nano-2512 Fun-ASR-MLT-Nano-2512是阿里通义实验室推出的轻量级多语言语音识别模型,特别适合需要本地化部署的场景。这个800M参数的模型虽然小巧,但功能…...

Scala入门必修课:val与var的深度对比与选择指南

Scala入门必修课:val与var的深度对比与选择指南1. 引言:变量定义的灵魂拷问2. 基础概念:val与var的定义2.1 直观区别2.2 类型推导3. 深入理解:从编译到执行3.1 编译后的字节码差异3.2 内存与性能考量4. 实际应用:选择指…...

如何突破内容访问限制?5类开源工具的技术解析与场景适配

如何突破内容访问限制?5类开源工具的技术解析与场景适配 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,优质内容往往被各种访问限制所阻…...

Python开源代码管理避坑实战:从Git高级操作到Docker环境配置

前言:为什么你总在开源门前徘徊? “这个项目看起来好复杂,我连代码都看不懂...” “提交PR会不会被大佬嘲笑?” “环境配置又报错了,算了,下次再说吧” 如果你有过这些想法,别担心&#xff…...

当心“Pin-to-Pin兼容“陷阱:ICM-42688国产替代芯片深度拆解与避坑指南

两句话总结:近期TDK ICM-42688-P价格暴涨至百元且一芯难求,立创商城上出现了华轩阳、Tokmas等"国产替代"。本文通过详细对比三家datasheet数据手册,揭示所谓"兼容"背后的软件陷阱与性能差异。结论可能出乎你意料&#xf…...

建行江门市分行:量身定制金融策 陈皮产业绽新姿

“前期承包土地、购买柑苗已投入大量资金,后续还要设法购买化肥。”眼看资金接续不上,前期投入面临打水漂,流动资金短缺让江门新会某陈皮庄园负责人老李一筹莫展。 获悉老李困境后,建行广东江门分行网点客户经理驱车前往果园实地走…...

告别迷茫!Java程序员入门AI的完整学习地图

文章目录前言一、先破三个心魔:Java搞AI到底靠不靠谱?心魔一:AI都是Python的天下,Java只能看戏?心魔二:必须得回炉重造学数学?心魔三:要从Hello World开始学Python?二、J…...

重构Sketch图层管理流程:RenameIt效率引擎突破设计协作瓶颈

重构Sketch图层管理流程:RenameIt效率引擎突破设计协作瓶颈 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 在现代UI/UX设计工作流中,…...