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

RabbitMq交换机类型介绍

RabbitMq交换机类型介绍

在RabbitMq中,生产者的消息都是通过交换器来接收,然后再从交换器分发到不同的队列,再由消费者从队列获取消息。这种模式也被成为“发布/订阅”。

分发的过程中交换器类型会影响分发的逻辑。

  • 直连交换机:Direct exchange
  • 扇形交换机:Fanout exchange
  • 主题交换机:Topic exchange
  • 首部交换机:Headers exchange

1 DirectExchange(直连交换机)

​ 直连交换机是一种带路由功能的交换机,交换机会通过路由(Routing_key)和指定队列进行绑定。在创建的时候会创建一个路由,和一个绑定关系,路由和绑定关系相互对应。

​ 发送消息时会指定exchange和routing_key,所有通过该routing_key和exchange绑定的队列都会收到同样的消息。

在这里插入图片描述

测试实例在https://blog.csdn.net/qq_43331014/article/details/132255631文章中作为例子详细讲解过了。

2 Topic exchange(主题交换机)

​ 在RabbitMq中,生产者的消息都是通过交换机来接收,然后再从交换机分发到不同的队列中去,在分发的过程中交换机类型会影响分发的逻辑,下面主要讲解一下主题交换机。

​ 主题交换机核心是可以以范围的行为向队列发送消息,它和直连交换机区别在于,直连交换机一个队列通过一个binding_key和交换机的进行绑定,只能接受一中消息;主题交换机可以按照一定的匹配规则去匹配多个routing_key

那匹配规则是什么?

交换机和队列的binding_key需要采用*.#.*.....的格式,每个单词用.作为分隔符,其中:

  • *表示一个单词(必须出现的)
  • ##(井号)用来表示任意数量单词(零个或多个)

例如:假设有一条消息的routing_keytopic.china.shanghai,另一条为topic.china,那么binding_keytopic.#的队列这两条消息都会收到

通配符功能示例
\*匹配一个单词topic.* 可以匹配到 topic.china 或者 topic.shanghai
#匹配零个或多个单词topic.# 可以匹配到 topic.china或者 topic.china.beijing

通俗理解:

​ 主题交换机的流程,相当于报纸订阅。有一个总报社(相当于生产者)发出各种类型的报纸到各个分报社,分报社相当于不同的交换机,每种类型报纸相当于不同的routing_key,再往下有卖报点去分报社去报纸,但每个卖报点根据消费者的需求所需要的类型不一样。比如一个分报社手里有两种类型的报纸:新闻.经济新闻.体育。这时三个卖报点来取报纸,卖家A只需要新闻经济类,那他跟交换机的binding_key就是新闻.经济;卖家B只需要新闻体育类,那他的binding_key就是新闻.体育;而卖家C这很多消费者都在他这买报纸,他既需要新闻经济类又需要新闻体育类,他的binding_key相当于是新闻.#,新闻下面的都收。

​ 而直连交换机是什么,相当于更小的分销商,针对更精确的人群。他不能像上面那种情况把新闻下所有类都收了,只能一对一的关系,有人需要新闻.经济就绑定上,只去收新闻.经济报,不能多拿,再有人需要新闻.体育才能再收体育报。

下面通过代码演示下主题交换机

  • 创建交换机、队列、绑定关系

    @Configuration
    public class TopicRabbitConfig {@Beanpublic Queue firstQueue(){return new Queue("topic.shanghai",true,false,false);}@Beanpublic Queue secondQueue(){return new Queue("topic.beijing",true,false,false);}@Beanpublic Queue thirdQueue(){return new Queue("topic.china.beijing",true,false,false);}@Beanpublic TopicExchange topicExchange(){return new TopicExchange("topicExchange",true,false);}/*** 交换机和队列绑定,并设置绑定key*/@BeanBinding firstBinding(){return BindingBuilder.bind(firstQueue()).to(topicExchange()).with("topic.shanghai");}@BeanBinding secondBinding(){//只要是消息携带的路由键是以topic.开头,后面还更有一个单词的都会分发到该队列return BindingBuilder.bind(secondQueue()).to(topicExchange()).with("topic.*");}@BeanBinding thirdBinding(){//只要是消息携带的路由键是以topic.开头,都会分发到该队列return BindingBuilder.bind(thirdQueue()).to(topicExchange()).with("topic.#");}
    }
    

    可以看到已经创建成功
    在这里插入图片描述
    在这里插入图片描述

  • 分别给交换机按三个不同routing_key发送消息,对应的routing_key分别为:topic.shanghaitopic.haha.hehetopic.test

    @PostMapping("/sendMessageByTopic")
    public AjaxResult sendMessageByTopic(@RequestBody Map params) {String id = UUID.randomUUID().toString();String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));params.put("messageId",id);params.put("createTime",createTime);/*** 发给交换机,通过匹配队列和交换机绑定关系值,判断发送给哪个队列*/rabbitTemplate.convertAndSend("topicExchange","topic.shanghai",params);rabbitTemplate.convertAndSend("topicExchange","topic.haha.hehe",params);rabbitTemplate.convertAndSend("topicExchange","topic.test",params);return AjaxResult.success("成功");
    }
    

    三个队列分别对应的匹配规则及接受到消息的结果如图:
    在这里插入图片描述

    可以看到topic.shanghai队列只能匹配一条,topic.china.beijing队列因为binding_key是topic.#所以全部匹配,topic.beijing队列因为binding_key是topic.*,所以匹配了topic后面只跟一个单词的。

监听就不细说了,跟交换机类型关系不大,主要根据队列名称去监听,实例可以看https://blog.csdn.net/qq_43331014/article/details/132255631第六节

3 Fanout exchange(扇形交换机)

扇形交换机广播消息,会将接到的消息发送到每一个与其绑定的队列中去。

不需要管绑定的binding_key是什么

在这里插入图片描述

在编写发送消息代码时,不需要填写routing_key

/***广播交换机* @return* @throws InterruptedException*/
@PostMapping("/sendMessageByFanout")
public AjaxResult sendMessageByFanout(@RequestBody Map params) {String id = UUID.randomUUID().toString();String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));params.put("messageId",id);params.put("createTime",createTime);/*** 扇形交换机,不需要指定路由,会广播给每一个绑定的队列*/rabbitTemplate.convertAndSend("fanoutExchange","",params);return AjaxResult.success("成功");
}

4 Headers exchange(首部交换机)

​ 与routingKey无关,匹配机制是匹配消息头中的属性信息。在绑定消息队列与交换机之前声明一个map键值对,通过这个map对象实现消息队列和交换机的绑定。当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息

x-match = any :表示只要有键值对匹配就能接受到消息

种交换器类型在性能上相对来说较差,在实际工作中很少会用到。
在这里插入图片描述

相关文章:

RabbitMq交换机类型介绍

RabbitMq交换机类型介绍 在RabbitMq中,生产者的消息都是通过交换器来接收,然后再从交换器分发到不同的队列,再由消费者从队列获取消息。这种模式也被成为“发布/订阅”。 分发的过程中交换器类型会影响分发的逻辑。 直连交换机&#xff1a…...

中国电信秋招攻略,考试内容分析

电信秋招简介 每年的毕业生人数都在逐年递增,逐年递增就意味着竞争会越来越大,最好比别人做更充足的准备。要确定好就业方向以及就业的岗位,要了解各种各样的流程,做好一切自己能做到的准备。而对于有想法进入电信公司工作的人来…...

prompt-engineering-note(面向开发者的ChatGPT提问工程学习笔记)

介绍: ChatGPT Prompt Engineering Learning Notesfor Developers (面向开发者的ChatGPT提问工程学习笔记) 课程简单介绍了语言模型的工作原理,提供了最佳的提示工程实践,并展示了如何将语言模型 API 应用于各种任务的应用程序中。 此外&am…...

2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码)

2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码) 1、时间:2011-2020(省级、城市),2014-2020(区县) 2、原始数据来源:北大金融研究中心…...

[ MySQL ] — 常见函数的使用

目录 日期函数 current_date — 获取当前日期 current_time — 获取当前时间 current_timestamp — 获取当前时间戳 date — 获取参数的日期部分 ​编辑 date_add — 在日期或时间的基础上进行增加 date_sub — 在日期或时间的基础上进行减少 datediff — 计算两个日期相差…...

Spring AOP实现切入增强的两种方式(execution+annotation)-Demo

pom文件依赖 <!-- AOP切面编程启动环境依赖组 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 1、通过execution表达式实现切入增强 package com…...

人工智能在网络安全中的作用:当前的局限性和未来的可能性

人工智能 (AI) 激发了网络安全行业的想象力&#xff0c;有可能彻底改变安全和 IT 团队处理网络危机、漏洞和勒索软件攻击的方式。 然而&#xff0c;对人工智能的能力和局限性的现实理解至关重要&#xff0c;并且存在许多挑战阻碍人工智能对网络安全产生直接的变革性影响。 在…...

BC99 序列中整数去重

描述 输入n个整数的序列&#xff0c;要求对这个序列进行去重操作。所谓去重&#xff0c;是指对这个序列中每个重复出现的整数&#xff0c;只保留该数第一次出现的位置&#xff0c;删除其余位置。 输入描述 输入包含两行&#xff0c;第一行包含一个正整数n&#xff08;1 ≤ n…...

[PyTorch][chapter 52][迁移学习]

前言&#xff1a; 迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习方法&#xff0c;它通过将一个领域中的知识和经验迁移到另一个相关领域中&#xff0c;来加速和改进新领域的学习和解决问题的能力。 这里面主要结合前面ResNet18 例子&#xff0c;详细讲解一…...

Ceph如何操作底层对象数据

1.基本原理介绍 1.1 ceph中的对象(object) 在Ceph存储中&#xff0c;一切数据最终都会以对象(Object)的形式存储在硬盘&#xff08;OSD&#xff09;上&#xff0c;每个的Object默认大小为4M。 通过rados命令&#xff0c;可以查看一个存储池中的所有object信息&#xff0c;例如…...

sklearn机器学习库(二)sklearn中的随机森林

sklearn机器学习库(二)sklearn中的随机森林 集成算法会考虑多个评估器的建模结果&#xff0c;汇总之后得到一个综合的结果&#xff0c;以此来获取比单个模型更好的回归或分类表现。 多个模型集成成为的模型叫做集成评估器&#xff08;ensemble estimator&#xff09;&#xf…...

FlutterBoost 实现Flutter页面内嵌iOS view

在使用Flutter混合开发中会遇到一些原生比Flutter优秀的控件&#xff0c;不想使用Flutter的控件&#xff0c;想在Flutter中使用原生控件。这时就会用到 Flutter页面中内嵌 原生view&#xff0c;这里简单介绍一个 内嵌 iOS 的view。 注&#xff1a;这里使用了 FlutterBoost。网…...

走嵌入式还是纯软件?学长告诉你怎么选

最近有不少理工科的本科生问我&#xff0c;未来是走嵌入式还是纯软件好&#xff0c;究竟什么样的同学适合学习嵌入式呢&#xff1f;在这里我整合一下给他们的回答&#xff0c;根据自己的经验提供一些建议。 嵌入式领域也可以分为单片机方向、Linux方向和安卓方向。如果你的专业…...

【云计算原理及实战】初识云计算

该学习笔记取自《云计算原理及实战》一书&#xff0c;关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”&#xff0c;因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月&#xff0c;在圣何塞举办的SES&#xff08;捜索引擎战略&#xff09;大会上&a…...

Open3D (C++) 基于拟合高差的点云地面点提取

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、原始点云2、提取结果四、相关链接系列文章(连载中。。。): Open3D (C++) 基于高程的点云地面点提取Open3D (C++) 基于拟合平面的点云地面点提取Open3D (C++) 基于拟合高差的点云地面点提取</...

认识Transformer:入门知识

视频链接&#xff1a; https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 文章目录 Self-Attention layerMulti-head self-attentionPositional encodingSeq2Seq with AttentionTransformerUniversal Transformer Seq2Seq …...

《TCP IP网络编程》第二十四章

第 24 章 制作 HTTP 服务器端 24.1 HTTP 概要 本章将编写 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;服务器端&#xff0c;即 Web 服务器端。 理解 Web 服务器端&#xff1a; web服务器端就是要基于 HTTP 协议&#xff0c;将网页对…...

【AI】文心一言的使用

一、获得内测资格&#xff1a; 1、点击网页链接申请&#xff1a;https://yiyan.baidu.com/ 2、点击加入体验&#xff0c;等待通过 二、获得AI伙伴内测名额 1、收到短信通知&#xff0c;点击链接 网页Link&#xff1a;https://chat.baidu.com/page/launch.html?fa&sourc…...

CSAPP Lab2:Bomb Lab

说明 6关卡&#xff0c;每个关卡需要输入相应的内容&#xff0c;通过逆向工程来获取对应关卡的通过条件 准备工作 环境 需要用到gdb调试器 apt-get install gdb系统: Ubuntu 22.04 本实验会用到的gdb调试器的指令如下 r或者 run或者run filename 运行程序,run filename就…...

Java中使用流将两个集合根据某个字段进行过滤去重?

Java中使用流将两个集合根据某个字段进行过滤去重? 在Java中&#xff0c;您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码&#xff0c;展示如何根据对象的某个字段进行过滤和去重操作&#xff1a; import java.util.ArrayList; import java.util.List; impor…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...