RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录

1、引入

2、Fanout交换机

案例:利用SpringAMQP演示Fanout交换机的使用

3、Direct交换机

案例:利用SpringAMQP演示Direct交换机的使用

4、Topic交换机

案例:利用SpringAMQP演示Topic交换机的使用


1、引入

        真实的生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机常用类型:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

为什么需要用到交换机:

        我们上一篇文章案例中可以看到,消息发送者如果直接把消息发到队列中,消息就只能被一个消费者消费者,而生产环境下是存在一个消息发出去后,有好几个消费者都可以拿到这个消息去消费的~


2、Fanout交换机

Fanout交换机 会将接收到的消息广播到每一个与其绑定的queue上

案例:利用SpringAMQP演示Fanout交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
  • 在RabbitMQ控制台中,声明交换机fan.fanout,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
  • 在publisher中编写测试方法,向fan.fanout发送消息

控制台中的操作就不说了,直接看代码:

consumer:

@RabbitListener(queues = "fanout.queue1")public void listenfan1(String msg) throws InterruptedException {System.out.println("接收到消息:" + msg);}@RabbitListener(queues = "fanout.queue2")public void listenfan2(String msg) throws InterruptedException {System.err.println("接收到消息:" + msg);}

publisher:

 @Testpublic void fanoutdemo(){//交换机名String exchangeName = "fan.fanout";//消息String message = "are you ok ?  I am ok !";//发送消息rabbitTemplate.convertAndSend(exchangeName,null, message);}

结果:两个消费者都收到了


3、Direct交换机

        Direct交换机 会将接收到的消息根据规则路由到指定的Queue,因此成为定向路由:

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchang将消息路由到BindingKey与消息RoutingKey一致的队列

举例:

        现在有一个支付服务,要求支付成功后,给用户发送一条短信。此时支付服务会把支付结果发送到交换机中,而短信服务就会去监听这个交换机,但是交换机不会把所有的消息都路由给短信服务,而只把支付成功的消息路由给这个短信服务。这种情况下,就需要使用到这个Direct交换机,短信服务下的队列和这个交换机设置一个key(例如:success),支付服务发消息时,支付成功RoutingKey设为success,失败为fail,交换机就会只把key为success的消息路由给短信服务了~

如下:

上图中,就是,key为blue,消费者1去消费;key为yellow,消费者1去消费;key为red,两个消费者都能拿到这个消息一起去消息~

案例:利用SpringAMQP演示Direct交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列dir.queue1和dir.queue2
  • 在RabbitMQ控制台中,声明交换机dir.direct,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听dir.queue1和dir.queue2
  • 在publisher中编写测试方法,向dir.direct发送消息

控制台中的操作,注意:

直接看代码:

consumer:

@RabbitListener(queues = "dir.queue1")public void listendir1(String msg) throws InterruptedException {System.out.println("接收到" + msg);}@RabbitListener(queues = "dir.queue2")public void listendir2(String msg) throws InterruptedException {System.err.println("接收到" + msg);}

publisher:

@Testpublic void directdemo(){//交换机名String exchangeName = "dir.direct";//发送消息rabbitTemplate.convertAndSend(exchangeName,"red", "消息:red");rabbitTemplate.convertAndSend(exchangeName,"blue","消息:blue");rabbitTemplate.convertAndSend(exchangeName,"yellow","消息:yellow");}

结果:red都能收到,blue、yellow指定的queue才能收到


4、Topic交换机

        Topic交换机与Direct交换机类似,区别在于RoutingKey可以是多个单词的列表,并且以 . 分割

Queue与交换机指定BindingKey时可以使用通配符:

  • # : 代指0个或多个单词
  • * : 代指一个单词

 

案例:利用SpringAMQP演示Topic交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
  • 在RabbitMQ控制台中,声明交换机topic.topic,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  • 在publisher中编写测试方法,利用不同的RoutingKey向topic.topic发送消息

控制台中的操作,注意:

 consumer:

@RabbitListener(queues = "topic.queue1")public void listentopic1(String msg) throws InterruptedException {System.out.println("接收到" + msg);}@RabbitListener(queues = "topic.queue2")public void listentopic2(String msg) throws InterruptedException {System.err.println("接收到" + msg);}

publisher:

@Testpublic void topicdemo(){//交换机名String exchangeName = "topic.topic";//发送消息rabbitTemplate.convertAndSend(exchangeName,"china.whether", "消息:中国天气预报");rabbitTemplate.convertAndSend(exchangeName,"china.news","消息:中国新闻");rabbitTemplate.convertAndSend(exchangeName,"LD.whether","消息:外国天气预报");rabbitTemplate.convertAndSend(exchangeName,"LD.news","消息:外国新闻");}

结果:

一个只能接到新闻,一个只能接到和中国相关的消息~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/371764.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】VASA-1: Lifelike Audio-Driven Talking FacesGenerated in Real Time

整体框架。不直接生成视频帧,而是在潜在空间中生成整体面部动态和头部运动,条件是音频和其他信号。给定这些运动潜在编码,通过面部解码器生成视频帧,还接受从输入图像中提取的外观和身份特征作为输入。 构建了一个面部潜在空间并…

大连外贸建站公司wordpress主题模板

Robonaut萝卜纳特WP外贸站模板 适合用于工业机器人公司出口做外贸搭建公司官方网站使用的WordPress模板。 https://www.jianzhanpress.com/?p7091 优衣裳WordPress外贸建站模板 简洁的wordpress外贸独立站模板,适合服装、衣服、制衣外贸公司搭建公司官方网站使用…

视频翻译英文的软件有哪些?打破语言障碍就用这5个

打算趁着暑假假期悄悄努力惊艳所有人的小伙伴在哪呢~ 相信不少朋友自学都会首选在家看网课,不过有时候面对全英的外语课程,难免总会听得一头雾水~ 但其实这个问题很好解决!码好以下这5款视频翻译工具,语言障碍的问题也就都迎刃而…

打破中国算力瓶颈的暴雨模式

6月27日,一场汇聚政府领导、人工智能领域顶尖专家学者和行业领军代表的高峰论坛—“算力中国高峰论坛”在北京清华科技园紫荆会议中心盛大举行。本次论坛由庆阳市人民政府、甘肃省人工智能与算力技术重点实验室共同举办,旨在加快探索科技前沿&#xff0c…

Python 算法交易实验76 QTV200日常推进

说明 最近实在太忙, 没太有空推进这个项目,我想还是尽量抽一点点时间推进具体的工程,然后更多的还是用碎片化的时间从整体上对qtv200进行设计完善。有些结构的问题其实是需要理清的,例如: 1 要先基于原始数据进行描述…

下载linux的吐槽

本来这几天放假了,想下一个linux玩一玩 教程(我就是根据这个教程进行下载的,但是呢在进行修改BIOS 模式的 地方遇见了困难,也许是电脑修过的原因,我狂按F12 以及 FnF12都没有BIOS设置,只有一个让我选择用w…

puppeteer 爬虫初探

1. puppeteer 和 puppeteer-core 安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器; 安装 puppeteer-core ,不会安装 chrome, 若要程序打开浏览器运行时,需手动指定电脑系统安装的 chrome 浏览器路径; 2. puppeteer-core …

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 今天,我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看,我们首先要带着大家明白Linux网络的一些名词的概念,为之后的学习扫清障碍。然后我…

权限控制权限控制权限控制权限控制权限控制

1.权限的分类 视频学习:https://www.bilibili.com/video/BV15Q4y1K79c/?spm_id_from333.337.search-card.all.click&vd_source386b4f5aae076490e1ad9b863a467f37 1.1 后端权限 1. 后端如何知道该请求是哪个用户发过来的 可以根据 cookie、session、token&a…

开源六轴协作机械臂myCobot 280接入GPT4大模型!实现更复杂和智能化的任务

本文已经或者同济子豪兄作者授权对文章进行编辑和转载 引言 随着人工智能和机器人技术的快速发展,机械臂在工业、医疗和服务业等领域的应用越来越广泛。通过结合大模型和多模态AI,机械臂能够实现更加复杂和智能化的任务,提升了人机协作的效率…

easyexcel使用小结-未完待续

官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/ <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.1</version></dependency>一、读 1.1简单读 Getter…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

stm32——外部中断EXTI

上回书说到定时器的级联&#xff0c;今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢&#xff1f;中断是指计算机在执行程序的过程中&#xff0c;当出现某些异常情况或特殊事件&#xff08;例如外部设备请求、定时时间到达、程序错误等…

LeetCode 744, 49, 207

目录 744. 寻找比目标字母大的最小字母题目链接标签思路代码 49. 字母异位词分组题目链接标签思路代码 207. 课程表题目链接标签思路代码 744. 寻找比目标字母大的最小字母 题目链接 744. 寻找比目标字母大的最小字母 标签 数组 二分查找 思路 本题比 基础二分查找 难的一…

Java求解百钱买百鸡问题(课堂实例2)

目录 &#x1f495;&#x1f495;引言&#x1f495;&#x1f495; &#x1f60d;&#x1f60d;点关注编程梦想家&#xff08;大学生版&#xff09;-CSDN博客不迷路&#x1f495;&#x1f495; 一、问题背景----百鸡百钱_百度百科 (baidu.com) &#x1d465;&#x1d466;&a…

黑马点评报错@user_script:17: user_script:17: attempt to compare nil with number

后面发现是需要预先写入缓存seckill:stock:11&#xff0c;其中11是优惠券id 我数据库里面是11 &#xff0c;这里redis里面也写了11之后就好使了

html+css+JavaScript 实现两个输入框的反转动画

开发时遇到了一个输入框交换的动画 做完之后觉得页面上加些许过渡或动画&#xff0c;其变化虽小&#xff0c;却能极大的提升页面质感&#xff0c;给人一种顺畅、丝滑的视觉体验。它的实现过程主要是通过css中的transition和animation来实现的。平时在开发的时候增加一些动画效…

python安装PyTorch+cuda

1,最终结果 import torchprint(torch.cuda.is_available()) #显示True&#xff0c;则安装成功 print(torch.__version__)#打印当前PyTorch版本号。 print(torch.version.cuda)#打印当前CUDA版本号。 print(torch.backends.cudnn.version())# 打印当前cuDNN版本号。 print(torc…

vuepress创建步骤

背景 记录vuepress配置步骤&#xff0c;以便下次使用快速上手。 读此文章之前默认您已经学会了创建vuepress项目。vuepres快速开始 最终成品 doc.jeecgflow.com 配置步骤 创建.vuepress 目录。 你的文档目录下创建一个 .vuepress 目录。 创建.vuepress/config.js module.e…

【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio

Abstract Whisper 的跨语言语音识别取得了很好的结果&#xff0c;但是对应的时间戳往往不准确&#xff0c;而且单词级别的时间戳也不能做到开箱即用(out-of-the-box). 此外&#xff0c;他们在处理长音频时通过缓冲转录