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

news2024/11/16 3:20:29

文章目录

  • 第三种模型(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) {
                    @Override
                    public 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 key
        channel.queueBind(queueName, "topics", "use.*");	

案例结果

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东LBS推荐算法实践

1、推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店、到家两种业务场景。同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主站复访复购频次,是零售的重要战略方向。 1.2 名词…

运行vue项目显示找不到vue-cli

直接下载ruoyi源码到本地,启动ruoyi-ui的时候报错: 原来是电脑没配置nodejs。 所以先去官网下载nodejs,然后安装完之后,在命令行窗口输入: 显示安装成功。 但还没有结束,还要配置npm的全局模块的存放路径…

Apache Doris 巨大飞跃:存算分离新架构

作者:马如悦 Apache Doris 创始人 历史上,数据分析需求的不断提升(更大的数据规模、更快的处理速度、更低的使用成本)和计算基础设施的不断进化(从专用的高端硬件、到低成本的商用硬件、到云计算服务)&…

高忆管理:k线分析股票走势?

K线是一种经典的技术剖析工具,经过制作股票价格的收盘、开盘、最高和最低价,形成实体和影线,以反映股票价格的动摇和趋势。本文将从多个角度剖析K线剖析股票走势的重要性及使用。 1. 提醒价格趋势 K线图能够清晰显现股票价格走势的趋势&…

性能测试必须掌握的知识点:并发和并行以及CPU的状态和核心参数

性能测试一定绕不开并发和并行,而并发和并行又离不开CPU,本文就来带大家深入理解一下究竟什么是并发和并行以及CPU的状态和核心参数。 并发和并行 通常情况下,CPU 有几个核,就可以并行执行几个进程(线程)…

00 - RAP 开发环境配置

文章目录 [1] Eclipse - ADT[2] BTP / S4HC[3] Add ABAP Env. Service[4] Conn. to BTP [1] Eclipse - ADT 关于如何安装配置,参见文章: Install ABAP Development Tools (ADT) and abapGit Plugin Eclipse Eclipse - ADT Eclipse - abapGit Plugin [2] BTP / S4…

Linux 安装软件 - yum工具

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行…

大龄青年的浙大MBA读书梦——提面优秀190+的上岸经验分享

时间如白驹过隙,三十年的岁月也转瞬即逝,回首过往这三十年的人生路,没有大起大落,一直都是相对比较平稳。但这几年疫情原因,公司效益不好,不仅我们公司整个行业也都在裁员,为了让自己更具备竞争…

Camtasia2023喀秋莎中文版视频编辑软件

Camtasia专业的 屏幕录制和视频剪辑软件 3000多万专业人士在全球范围内使用Camtasia展示产品,教授课程,培训他人,以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 喀秋…

PT swap cell脚本分享

swap cell驱动相同,footprint相同的情况下,大小是一样的,甚至不需要重新抽RC。 这里分享一下,pt size cell时只swap cell的脚本: define_user_attribute -class lib_cell -type string cell_area proc define_cell_ar…

ConcurrentHashMap源码详解

本文已收录于专栏 《Java》 目录 概念说明数据结构线程安全HashMap示例运行结果ConcurrentHashMap示例运行结果 涉及技术Synchronized概念特性 CAS(Compare And Swap)概念原理代码演示没有使用CAS的代码运行结果使用CAS的代码运行结果 总结提升 概念说明 ConcurrentHashMap是Ja…

vue3自定义dialog createApp setup语法组件使用element

目录 index.vue <template><el-dialogcenterv-model"isVisible"width"650px":title"title":append-to-body"true"><div id"dialogMap_container"></div><template #footer><span class&q…

7月31日每日两题

第一题:再解炸弹人 小哼最近爱上了“炸弹人”游戏。你还记得在小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。需将画面上的敌人全部消灭后,并找到隐藏在墙里的暗门才能过关。 现在有一个特殊的关卡如下。你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可…

【LeetCode】143.重排链表

题目 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交…

Michael.W基于Foundry精读Openzeppelin第16期——SignedSafeMath.sol

Michael.W基于Foundry精读Openzeppelin第16期——SignedSafeMath.sol 0. 版本0.1 SignedSafeMath.sol 1. 目标合约2. 代码精读2.1 mul(int256 a, int256 b)2.2 div(int256 a, int256 b)2.3 sub(int256 a, int256 b)2.4 add(int256 a, int256 b) 0. 版本 [openzeppelin]&#x…

试试这三款音频转换格式软件,看看可不可以转换mp3?

你是不是不知道音频转换格式有什么用呢&#xff1f;为什么要音频转换呢&#xff1f; 其实音频转换格式的原因是&#xff1a; ①兼容性问题&#xff1a;不同的设备支持不同的音频格式&#xff0c;如果你想在不同设备之间共享音频文件的话&#xff0c;那么需要将文件转换另一种…

Android HTTP使用(详细版)

前言 在面试过程中,HTTP 被提问的概率还是比较高的。 小林我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大的,通过问答 + 图解的形式由浅入深的方式帮助大家进一步的学习和理解 HTTP 协议。 HTTP 基本概念 Get 与 Post HTTP 特性…

Spring AOP 中的代理对象是怎么创建出来的?

文章目录 1. AOP 用法2. 原理分析2.1 doCreateBean2.2 postProcessAfterInitialization2.3 getAdvicesAndAdvisorsForBean2.3.1 findCandidateAdvisors2.3.2 findAdvisorsThatCanApply2.3.3 extendAdvisors 2.4 createProxy 今天和小伙伴们聊一聊 Spring AOP 中的代理对象是怎么…

将number输入框改写成只能输入数字的输入框

去掉 type”number” 末尾的箭头 场景代码 场景 在很多场景下&#xff0c;输入框是会被要求限制只能输入数字&#xff0c;不能输入文字或者符号的。通常我们会使用input事件 正则表达式 去实现这个功能&#xff0c;但今天提供另一种css的方法&#xff0c;将 type”number” 的…

面试总结-Redis篇章(九)——Redis主从复制、主从数据同步原理

Redis其他面试问题 主从复制单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离主节点主要进行客户端的写操作&#xff0c;从节点进行客户端的读操作&#xff0c;因为Redis一直都是读多写少&…