RabbitMQ交换机

目录

交换机类型 

直连交换机:Direct exchange

主题交换机:Topic exchange 

扇形交换机:Fanout exchange 

首部交换机:Headers exchange 

死信交换机:Dead Letter Exchange 

 交换机的属性

代码实战

直连(Direct实践)

主题 (Topic实践)

扇形(Fanout实践)


Exchange

在RabbitMQ中,生产者发送信息不会直接将消息投送到队列中,而是先将消息投递到交换机中,在由交换机转换到具体的队列,队列再将消息以推送或者拉取方式给消费者进行消费。

生产者将消息发送到Exchange,由Exchange再路由到一个或多个队列中

 路由键(RoutingKey)

生产者将信息发送给交换机的时候,会指定RoutingKey指定路由规则

绑定键(BindingKey) 

通过绑定键将交换机与队列关联起来,这样RabbitMQ就知道如何正确的将信息路由到队列 

交换机类型 

直连交换机:Direct exchange

Direct,完全匹配型交换机,此种类型交换机,通过RoutingKey路由键将交换机和队列进行绑定, 消息被发送到exchange时,需要根据消息的RoutingKey,来进行匹配,只将消息发送到完全匹配到此RoutingKey的队列。

 如图,不同的key绑定不同的队列,实现不同消息分发至不同队列。

 注意:同一个key,可以绑定多个queue队列。如图中,当匹配到key1时,则会将消息分发送至queue1和queue2,这样两个队列都会有相同的消息数据。 

主题交换机:Topic exchange 

Topic,主题类型交换机,此种交换机与Direct类似,也是需要通过routingkey路由键进行匹配分发,区别在于Topic可以进行模糊匹配,Direct是完全匹配。
Topic中,将routingkey通过"."来分为多个部分,通过如下功能字符来进行匹配:

  • "*":代表一个部分
  • "#":代表一个或多个部分

举个例子,加入绑定关系如下图:

然后发送一条信息,routingkey为"a.b.c.d",那么根据"."将这个路由键分为了4个部分,此条路由键,将会匹配:

  • a.b.c. :成功匹配,因为可以代表一个部分
  • a.b.# :成功匹配,因为#可以代表一个或多个部分
  • a..c.. : 成功匹配,因为第一和第三部分分别为a和c,且为4个部分,刚好匹配

注意:如果绑定的路由键为 "#" 时,则接受所有消息,因为路由键所有都匹配 

扇形交换机:Fanout exchange 

Fanout,扇出类型交换机,此种交换机,会将消息分发给所有绑定了此交换机的队列,此时RoutingKey参数无效。

此种方式,最简单快速,性能最好,因为少了中间的匹配判断环节。

首部交换机:Headers exchange 

Headers,headers信息类型交换机,此类型交换机不通过routingkey路由键来分发消息,而是通过消息内容中的headers属性来进行匹配。headers类型交换器性能差,在实际中并不常用。

虽然不常用,但也可以了解一下其,此种交换机不通过routingkey,但是通过headers进行绑定,也就是在声明binding绑定关系时,需要传入需要匹配的header的key/value键值对。

死信交换机:Dead Letter Exchange 

当一个队列中的消息满足下列情况之一。就可称为死信。

消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false

消息是一个过期消息,超时无人消费

要投递的队列消息满了,无法投递
如果这个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机。

 

 交换机的属性

Name:交换机名称

Type:交换机类型,direct、topic、fanout、headers 

durability:是否需要持久化,如果持久性,则RabbitMQ重启后,交换机还存在

Auto Delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange

Internal:当前Exchange是否用于RabbitMQ内部使用,默认为False

Arguments:扩展参数,用于扩展AMQP协议定制化使用

代码实战

直连(Direct实践)

先写两个队列和自定义一个直连交换机 

    @Beanpublic Queue queue1(){return new Queue("queue1");}@Beanpublic Queue queue2(){return new Queue("queue2");}@Beanpublic DirectExchange directExchange(){return new DirectExchange("directExchange");}

 给交换机分别绑定一个队列

    @Beanpublic Binding binding01(){return BindingBuilder.bind(queue1()).to(directExchange()).with("aa");}@Beanpublic Binding binding02(){return BindingBuilder.bind(queue2()).to(directExchange()).with("bb");}

在控制类给交换机发送一条消息

    @RequestMapping("/send2")public String send2 () throws Exception{template.convertAndSend("directExchange","aa","hello");return "😒";}

写两个测试类进行测试

package com.example.consumer;import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues="queue1")
public class ReceiverQ1 {@RabbitHandlerpublic void process(String msg){log.warn("Q1接收到:" + msg);}
}
package com.example.consumer;import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues="queue2")
public class ReceiverQ2 {@RabbitHandlerpublic void process(String msg){log.warn("Q2接收到:" + msg);}
}

 接着先启动生产者再启动消费者,但是可能会报错

我们需要先去访问一下

可以发现在RabbitMQ中,出现了我们自定义的那个交换机的名称,队列中也有

 

再重新启动消费者就不会报错了 

主题 (Topic实践)

在这里和上面的步骤一样,在这里测试RoutingKey的一个部分和多个部分

    //主题交换机@Beanpublic TopicExchange topicExchange(){return new TopicExchange("topicExchange");}@Beanpublic Binding binding03(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.aa");}@Beanpublic Binding binding04(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.bb");}@Beanpublic Binding binding05(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");}@Beanpublic Binding binding06(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("mq.#");}
    @RequestMapping("/send3")public String send3 (String rex){template.convertAndSend("topicExchange",rex,"hello");return "😒";}

在页面上运行a.a.aa可以发现这个是进入到了Q1

运行a.a.bb是进入到了Q2

如果两个都想要接收到,就可以在页面上输入mq.a.a

扇形(Fanout实践)

步骤同上

    //扇形交换机@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("fanoutExchange");}@Beanpublic Binding binding07(){return BindingBuilder.bind(queue1()).to(fanoutExchange());}@Beanpublic Binding binding08(){return BindingBuilder.bind(queue2()).to(fanoutExchange());}

    @RequestMapping("/send4")public String send4(){template.convertAndSend("fanoutExchange","","hello");return "😒";}

 在页面上运行可以发现两个都可以出来

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

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

相关文章

x-cmd pkg | frp - 内网穿透工具

简介 frp(Fast Reverse Proxy)是一个专注于内网穿透的高性能反向代理应用,可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 它采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部…

使用torch实现RNN

在实验室的项目遇到了困难,弄不明白LSTM的原理。到网上搜索,发现LSTM是RNN的变种,那就从RNN开始学吧。 带隐藏状态的RNN可以用下面两个公式来表示: 可以看出,一个RNN的参数有W_xh,W_hh,b_h&am…

[AutoSar]BSW_OS 06 Autosar OS_Alarms

一、 目录 一、关键词平台说明一、Timer1.1 配置1.2Periodical Interrupt Timer (PIT)和High Resolution Timer (HRT) 二、Alarm 工作机制三、Code3.1创建一个15ms的runnable3.2mapping到basic task3.3生成代码 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueO…

k8s的helm

1、在没有helm之前,部署deployment、service、ingress等等 2、helm的作用:通过打包的方式,deployment、service、ingress这些打包在一块,一键部署服务、类似于yum功能 3、helm:官方提供的一种类似于仓库的功能&#…

时间轮设计

目录 基本概念 函数定义 函数实现与测试 测试1结果如下 测试2结果如下 基本概念 时间轮 是一种 实现延迟功能(定时器) 的 巧妙算法。如果一个系统存在大量的任务调度,时间轮可以高效的利用线程资源来进行批量化调度。把大批量的调度任务…

React16源码: React中的resetChildExpirationTime的源码实现

resetChildExpirationTime 1 )概述 在 completeUnitOfWork 当中,有一步比较重要的一个操作,就是重置 childExpirationTimechildExpirationTime 是非常重要的一个时间节点,它用来记录某一个节点的子树当中,目前优先级最…

C++提高编程——STL:string容器、vector容器

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…

数据结构:堆与堆排序

目录 堆的定义: 堆的实现: 堆的元素插入: 堆元素删除: 堆初始化与销毁: 堆排序: 堆的定义: 堆是一种完全二叉树,完全二叉树定义如下: 一棵深度为k的有n个结点的二…

ffmpeg使用及java操作

1.文档 官网: FFmpeg 官方使用文档: ffmpeg Documentation 中文简介: https://www.cnblogs.com/leisure_chn/p/10297002.html 函数及时间: ffmpeg日记1011-过滤器-语法高阶,逻辑,函数使用_ffmpeg gte(t,2)-CSDN博客 java集成ffmpeg: SpringBoot集成f…

科技云报道:金融大模型落地,还需跨越几重山?

科技云报道原创。 时至今日,大模型的狂欢盛宴仍在持续,而金融行业得益于数据密集且有强劲的数字化基础,从一众场景中脱颖而出。 越来越多的公司开始布局金融行业大模型,无论是乐信、奇富科技、度小满、蚂蚁这样的金融科技公司&a…

深度学习如何弄懂那些难懂的数学公式?是否需要学习数学?

经过1~2年的学习,我觉得还是需要数学有一定认识,重新捡起高等数学、概率与数理、线代等这几本,起码基本微分方程、求导、对数、最小损失等等还是会用到。 下面给出几个链接,可以用于平时充电学习。 知乎上的: 机器学…

计算机毕业设计 基于SpringBoot的律师事务所案件管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

git merge和git rebase区别

具体详情 具体常见如下,假设有master和change分支,从同一个节点分裂,随后各自进行了两次提交commit以及修改。随后即为change想合并到master分支中,但是直接git commit和git push是不成功的,因为分支冲突了【master以…

上位机图像处理和嵌入式模块部署(流程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,传统图像处理的方法,一般就是pccamera的处理方式。camera本身只是提供基本的raw data数据,所有的…

基于ADAS的车道线检测算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 图像预处理 4.2 车道线特征提取 4.3 车道线跟踪 5.完整工程文件 1.课题概述 基于ADAS的车道线检测算法,通过hough变换和边缘检测方法提取视频样板中的车道线,然后根据车道线的弯曲情况…

Linux/Mac 命令行工具 tree 开发项目结构可以不用截图了 更方便 更清晰 更全

tree 是一个命令行工具,用于以树形结构显示文件系统目录的内容。它可用于列出指定目录下的所有文件和子目录,以及它们的层次关系。tree 命令在许多操作系统中都可用,包括Unix、Linux和macOS。 效果如下: 一、安装 linux # De…

Prometheus+Grafana监控Mysql数据库

Promethues Prometheus https://prometheus.io Prometheus是一个开源的服务监控系统,它负责采集和存储应用的监控指标数据,并以可视化的方式进行展示,以便于用户实时掌握系统的运行情况,并对异常进行检测。因此,如何…

Spring Boot3整合knife4j(swagger3)

目录 1.前置条件 2.导依赖 3.配置 1.前置条件 已经初始化好一个spring boot项目且版本为3X,项目可正常启动。 作者版本为3.2.2最新版 2.导依赖 knife4j官网: Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com)http…

R语言简介

1.R语言 R语言是一种数学编程语言,主要用于统计分析、绘图和数据挖掘。 2.R语言特点 免费、开源,兼容性好(Windows、MacOS或Linux)。具有多种数据类型,如向量、矩阵、因子、数据集等常用数据结构。多用于交互式数据分析&#x…

股权众筹模式介绍(下)

3、线上线下两段式投资 对于已经成成立并运营的企业来说,由于《证券法》明确规定,向“不特定对象发行证券”以及“向特定对象发行证券累计超过200人”的行为属于公开发行证券,必须通过证监会核准,由证券公司承销。这些规定限定了…