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

【RabbitMQ(day3)】扇形交换机和主题交换机的应用

文章目录

  • 第三种模型(Publish/Subscribe 发布/订阅)
    • 扇型(funout)交换机
    • Public/Subscribe 模型
    • 绑定
  • 第四、第五种模型(Routing、Topics)
    • 第四种模型(Routing)
    • 主题交换机(Topic Exchange)
    • 第五种模型(Topics)

第三种模型(Publish/Subscribe 发布/订阅)

扇型(funout)交换机

扇型交换机将消息路由给绑定到它身上的所有队列,而不会理会绑定的路由键。如果 N 个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的 N 个队列。扇型用来交换机处理消息的广播路由。

因为扇型交换机投递信息的拷贝到所有绑定到它的队列,所以它可以用来在群聊的时候,分发消息给参与群聊的用户。

扇型交换机图例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTprwNAp-1690737452900)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730165558799.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-seBDWtoY-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730165644205.png)]

Public/Subscribe 模型

在这种模式下,消息发送流程是这样的:

  • 可以有多个消费者;
  • 每个消费者有自己的 queue(队列)
  • 每个队列都要绑定到 Exchange(交换机)
  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
  • 交换机把所有的消息发送给绑定过的所有队列。
  • 队列的消费者都能拿到消息。实现一条消息被多个消费者消费。
  1. 开发生产者
        // 将通道声明指定的交换机// 参数1:交换机的名称// 参数2:交换机的类型channel.exchangeDeclare("logs","fanout");// 发送消息channel.basicPublish("logs","",null,"fanout type message".getBytes());
  1. 开发消费者
        // 通道声明交换机channel.exchangeDeclare("logs","fanout");// 临时队列String queueName = channel.queueDeclare().getQueue();// 队列绑定交换机channel.queueBind(queueName,"logs","");

实例代码:

        Runnable myRunnable = () -> {try {Connection conn = RabbitMQUtils.getConnection();Channel channel = conn.createChannel();// 通道声明交换机channel.exchangeDeclare("logs", "fanout");// 临时队列String queueName = channel.queueDeclare().getQueue();// 队列绑定交换机channel.queueBind(queueName, "logs", "");// 消费消息channel.basicConsume(queueName, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消费者" + consumerTag + ":" + new String(body));}});} catch (IOException e) {e.printStackTrace();}};Thread t1 = new Thread(myRunnable);Thread t2 = new Thread(myRunnable);Thread t3 = new Thread(myRunnable);t1.start();t2.start();t3.start();

结果(有群发那味了):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aO7A1Bp9-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730174044020.png)]

绑定

  • 绑定是交换机将消息路由给队列所需遵循的规则。如果要制定交换机“E”将消息路由给队列“Q”,那么“Q”就需要与“E”进行绑定。绑定操作需要定义一个可选的路由键(routing key)属性给某些类型的交换机(当然像这第三种模型这样的,路由键有没有无所谓的,则不需声明路由键,而前两种模型下,是自动绑定的,交换机则为默认交换机,路由键和队列名一致的。)。路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给绑定的队列,然后消费者再从队列中消费消息。

第四、第五种模型(Routing、Topics)

第四种模型(Routing)

在第三种模型中,一条消息会被所有订阅的队列都消费。但是,在某些场景下,希望不同的消息被不同的队列消费。这时候就需要用直连交换机构建的路由routing模型了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPCNxtpC-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230731002003368.png)]

图解:

  • P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
  • X:Exchange(交换机),接收生产者的消息,然后把消息递交给与routing key完全匹配的队列。
  • C1:消费者,其所在队列指定了需要routing key 为error的消息。
  • C2:消费者,其所在队列指定了需要routing key 为 info、error、warning的消息。
  1. 开发生产者
		// 通过通道声明交换机channel.exchangeDeclare("logs_routing", "direct");// 发送消息String routingKey = "info";channel.basicPublish("logs_routing", routingKey, null, ("这是direct模型发布的基于route key:" + routingKey).getBytes());
  1. 开发消费者
        // 通道声明交换机以及交换的类型channel.exchangeDeclare("logs_routing", "direct");// 创建一个临时队列String queueName = channel.queueDeclare().getQueue();// 基于route key 绑定队列和交换机channel.queueBind(queueName, "logs_routing", "error");

主题交换机(Topic Exchange)

主题交换机通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列(注意这是消息给一个或多个队列,和直连交换机可不同,直连是路由键和队列同名,一个消息对应一个队列这种才是直连)。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由(与第三种模型的广播路由不同)。

主题交换机拥有非常广泛的用户案例。当一个问题涉及到那些想要有针对性的选择需要接收消息的多消费/多应用的时候,主题交换机都可以被列入考虑范围。

第五种模型(Topics)

主题交换机和直连交换机相比,都是可以根据 routingkey 把消息路由到不同的队列。只不过主题交换机可以让队列在绑定 routingkey 的时候使用通配符。这种模型 routingkey 一般都是由一个或者多个单词组成,多个单词之间以.分割,例如:item.insert

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBnGlwKf-1690737452902)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230731005829465.png)]

通配符
* (star) can substitute for exactly one word. 匹配一个单词
# (hash) can substitute for zero or more words. 匹配一个或多个单词如:
audit.# 匹配audit.irs.corporate 或者 audit.irs 等
audit.* 只能匹配audit.irs
  1. 生产者
		 // 声明交换机以及交换机类型channel.exchangeDeclare("topics", "topic");// 发布消息String routeKey = "user.delete";channel.basicPublish("topics", routeKey, null, ("这里是topic动态路由模型,route key:" + routeKey).getBytes());
  1. 消费者
		// 生命交换机以及交换机类型channel.exchangeDeclare("topics", "topic");// 创建一个临时队列String queueName = channel.queueDeclare().getQueue();// 绑定队列和交换机 动态通配符形式 route keychannel.queueBind(queueName, "topics", "use.*");	

案例结果

请添加图片描述

相关文章:

【RabbitMQ(day3)】扇形交换机和主题交换机的应用

文章目录 第三种模型(Publish/Subscribe 发布/订阅)扇型(funout)交换机Public/Subscribe 模型绑定 第四、第五种模型(Routing、Topics)第四种模型(Routing)主题交换机(To…...

redis 高级篇 redis 源码的读取分析

一 redis源码分析 1.1 源码分析 1每一个kv键值对应有一个dictEntry。 2.底层数据结构...

Acwing.873.欧拉函数

题目 给定n个正整数ai,请你求出每个数的欧拉函数。 输入格式 第一行包含整数n。 接下来n行,每行包含一个正整数ai。 输出格式 输出共n行,每行输出一个正整数an的欧拉函数。 数据范围 1 ≤n ≤100 1≤ai≤2* 109 输入样例: 3 3 6 8输…...

深入浅出FPGA——笔记7 代码风格

1 寄存器电路的设计方式 废话:时序逻辑设计是核心,而寄存器又是时序逻辑的基础。 1: 简单的时序输入输出模型 如下图所示,在每个时钟信号clk的有效沿(通常是上升沿),输入端数据din将被锁存到输出端dout。…...

npm, yarn配置

一、npm 1. 查看当前的镜像源。 npm config get registry 2. 设置为淘宝源 npm config set registry https://registry.npm.taobao.org 3. 还原默认源 npm config set registry https://registry.npmjs.org/ 二、Yarn 1.yarn的安装 npm install -g yarn 2. 查看当…...

跨域情况下,vue如何下载后台接口提供的application/octet-stream文件流Excel文件

前言 由于跨域,所以无法直接通过window.location.href或者a标签直接下载,直接拼后台接口地址又暴露了后台地址,不可行。 所以在这种跨域情况下,本章讲一下vue如何下载后台接口提供的application/octet-stream文件流Excel文件。 …...

学C的第三十一天【通讯录的实现】

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十天【自定义类型:结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求: 实现一个通讯录, 通讯录中存放保存人的信息&#xff1…...

Linux操作系统学习,Linux基础命令大全

目录 第一章、Linux简介和安装1.1)Linux简介和分类1.2)安装VMware虚拟机,在虚拟机中安装CentOS 7 第二章、虚拟机中Linux的IP地址配置详解2.1)什么是IP地址,如何查看2.2)虚拟机NAT模式中Linux的IP地址设置有…...

【软件测试】说说你对TDD测试驱动开发的理解?

很多公司在面测试中高级岗时,都会不同程度地问到“有没有了解过TDD”“你认为TDD可以解决什么问题”或者“说说测试驱动开发的流程”等等,即使公司并不会用到此开发流程,面试官也会通过你对这个相对还比较“陌生”的概念的讲述来了解你对一些…...

B. Binary Cafe(二进制的妙用)

题目:Problem - B - Codeforces 总结: 对于该题最简单的方法为使用二进制的数表示状态 例如: 对于一个数7的二进制:111 它的每一位都可表示两种状态我们可以理解为取或者不取 对于7这个数字它可以表示一种状态即在三个位置都…...

SpringBoot单元测试

目录 1.什么是单元测试? 2.单元测试有哪些好处? 3.Spring Boot单元测试使⽤ 单元测试的实现步骤 1. ⽣成单元测试类 2. 添加单元测试代码 2.1 .添加Spring Boot框架测试注解:SpringBootTest 2.2 添加单元测试业务逻辑 简单的断⾔说明 1.什么是单元测试? 单元测试(un…...

刷题 41-45

四十一、移除元素 示例 1: 输入:nums [3,2,2,3], val 3 输出:2, nums [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 …...

Centos时间同步

前言 在 Linux 操作系统中,正确的时间同步是非常重要的,因为它对于很多应用程序都是必需的。本文将介绍两种在 Centos 系统中同步当前时间的方式。 方法一:使用 ntpdate 命令同步当前时间 ntpdate 命令是一种简单快捷的同步当前时间的方式&a…...

Linux 查看磁盘空间

1 查看当前目录的总大小 :du -sh ps:du(disk usage) 2 查看某个目录的总大小:du -sh 目录名 3 查找出/目录下占用空间最大的前10个文件或者文件夹:sudo du -a / | sort -n -r | head -n 10 4 查看磁盘信息:df -h...

我的会议(我的审批,会议签字附源码)

目录 前言: 3.我的审批: 3.1实现的特色功能: 3.2显示的效果 3.3思路: 3.4寻找相关的案例或者自己使用JavaScript去写一个类似的功能 3.5具体的步骤: 3.5.1添加静态的jsp代码(我的审批数据的显示&…...

Python 装饰器该如何理解?

哈喽大家好,今天带大家了解下在Python中装饰器的使用 定义 首先我们先来了解下装饰器的定义。顾名思义,在Python中,装饰器本质上就是一个函数,它可以接收一个函数作为参数,然后返回一个新的函数。这个新的函数可以在…...

IDEA 模块不加载依旧是灰色 没有变成小蓝色的方块

Settings > Build, Execution, Deployment > Build Tools > Maven > Ignored Files下降对应的模块勾选掉 但通常在Maven的配置中,您会找到一个名为“ignoredFiles”的列表,其中包含被忽略的文件和目录。您可以通过取消选中所需的文件或目录…...

可以写进简历的kafka优化-----吞吐量提升一倍的方法

冲突 在看到项目工程里kafka 生产端配置的batch.size为500,而实际业务数据平均有1K大小的时候;我有点懵了。是的,这里矛盾了;莫非之前的作者认为这个batch.size是发送的条数,而不是kafka生产端内存缓存记录的大小&…...

JavaScript中,for in 和for of的区别

for in 遍历的是数组的索引(即键名),而 for of 遍历的是数组元素值(即键值)。for...in 循环出的是 key,for...of 循环出的是 value 推荐在循环对象属性的时候使用 for...in,在遍历数组的时候的时…...

计算机毕设 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…...

Linux微信小程序开发终极指南:从零搭建完整开发环境

Linux微信小程序开发终极指南:从零搭建完整开发环境 【免费下载链接】wechat-web-devtools-linux 适用于微信小程序的微信开发者工具 Linux移植版 项目地址: https://gitcode.com/gh_mirrors/we/wechat-web-devtools-linux 还在为Linux系统无法进行微信小程序…...

基于大语言模型的智能购物助手:从架构设计到工程实现

1. 项目概述:当AI遇上电商,一个“懂你”的购物助手如何炼成最近在逛GitHub的时候,发现了一个挺有意思的项目,叫“KudoAI/amazongpt”。光看名字,你大概能猜到它和亚马逊(Amazon)以及GPT有关。没…...

2025届最火的十大AI写作平台实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在这个信息呈现爆炸态势的时代当中,内容创作已然变成了个人以及企业所具备的核心…...

Midjourney铂金印相风格实战手册(从Prompt工程到Lightroom精修全流程)

更多请点击: https://intelliparadigm.com 第一章:铂金印相风格的美学溯源与数字复现逻辑 铂金印相(Platinum Print)诞生于19世纪晚期,以铂族金属盐在纸基上直接成像,呈现无光泽、宽广影调与近乎永久的化学…...

从零开始:如何在Windows电脑上完美使用Switch手柄的完整教程

从零开始:如何在Windows电脑上完美使用Switch手柄的完整教程 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 你是否曾经想过在Windows电脑上…...

在Windows上安装安卓应用的终极指南:APK安装器完整使用教程

在Windows上安装安卓应用的终极指南:APK安装器完整使用教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想要在Windows电脑上直接运行安卓应用吗&#x…...

【新手实用技能指南】OpenClaw 2.7.1 实用 Skill 技能全推荐(含安装包)

OpenClaw 实用 Skill 技能推荐|办公效率全面提升(新手必开) OpenClaw(小龙虾)的核心优势在于Skill 技能扩展,开启适配技能后,AI 可脱离单纯对话模式,自主完成各类电脑操作任务。本文…...

Cursor AI插件开发指南:构建企业级智能编码助手

1. 项目概述:一个为开发者而生的智能编码伴侣如果你是一名开发者,每天在IDE里敲代码的时间超过8小时,那你一定对“上下文切换”和“信息查找”这两件事深恶痛绝。想象一下,你正在写一个复杂的API接口,突然需要回忆上周…...

基于MCP协议构建Azure DevOps智能助手:连接AI与开发运维的实践指南

1. 项目概述:一个连接开发与运维的智能“翻译官”如果你和我一样,长期在Azure DevOps的流水线、看板和代码仓库里打转,同时又对新兴的AI编程助手(比如Claude、Cursor)爱不释手,那你肯定遇到过这样的困境&am…...

VOL框架数据库连接实战:从零到一的关键配置与常见陷阱解析

1. VOL框架数据库连接入门指南 第一次接触VOL框架的开发者,往往会在数据库配置环节栽跟头。我刚开始用VOL框架时也踩了不少坑,最典型的就是明明按照官方文档一步步操作,后端服务死活启动不了。后来发现是项目结构理解有偏差,导致配…...