RabbitMQ(补档)

        RabbitMQ 是一个开源的消息队列软件(有时也被称为消息代理),它实现了高级消息队列协议(AMQP)。它主要用于应用程序之间,或者软件组件之间的消息通信。通过使用 RabbitMQ,可以实现异步的、可靠的、可扩展的消息处理机制,这使得它成为构建分布式系统时的一个理想选择。

RabbitMQ 应用场景:

        解耦服务:在微服务架构或分布式系统中,服务之间可以通过消息队列进行通信,从而实现松散耦合。这样做的好处是,即使某些服务出现故障,也不会影响到整个系统的运行。

        异步处理:对于一些不需要立即响应的操作,可以采用异步的方式进行处理。例如,用户注册成功后发送欢迎邮件,这类操作可以放到消息队列中异步执行,从而提高用户体验和系统的吞吐量。

        负载均衡:通过将任务分发给多个消费者,RabbitMQ 可以帮助实现负载均衡,确保没有单个节点过载。这特别适用于需要处理大量请求的场景,如高并发的Web应用。

        批量处理:对于需要批量处理的任务,可以先将任务存储在 RabbitMQ 中,等到积累了一定数量的任务后再统一处理。这种方法可以减少数据库的访问次数,提升性能。


RabbitMQ组件:

        生产者(Producer):发送消息的应用程序。

        消费者(Consumer):接收消息的应用程序。

        队列(Queue):存储消息的地方,生产者将消息发送到队列中,消费者从队列中读取消息。

        交换机(Exchange):负责接收来自生产者的消息,并根据一定的规则将消息路由到相应的队列中。

        绑定(Binding):定义了交换机和队列之间的关系,即交换机如何将消息分发到具体的队列中。


RabbitMQ的工作流程

1.Producer ⽣产了⼀条消息

2.Producer 连接到RabbitMQBroker, 建⽴⼀个连接(Connection),开启⼀个信道(Channel)

3.Producer 声明⼀个交换机(Exchange), 路由消息

4.Producer 声明⼀个队列(Queue), 存放信息

5.Producer 发送消息⾄RabbitMQ Broker

6.RabbitMQ Broker 接收消息, 并存⼊相应的队列(Queue)中, 如果未找到相应的队列, 则根据⽣产者的配置, 选择丢弃或者退回给⽣产者


RabbitMQ 交换机类型

        RabbitMQ 提供了多种类型的交换机(Exchange),每种类型决定了消息如何从生产者路由到一个或多个队列。以下是 RabbitMQ 中主要的交换机类型:

1. 直连交换机(Direct Exchange)
        功能:直连交换机根据消息携带的路由键(Routing Key)和绑定键(Binding Key)是否完全匹配来决定将消息路由到哪个队列。
        使用场景:当需要基于不同条件将消息分发给不同的消费者时非常有用。例如,日志系统中可以根据严重性级别(如 info、warning、error)将消息路由到不同的目的地。

2. 主题交换机(Topic Exchange)
        功能:主题交换机允许使用通配符进行模式匹配路由键来路由消息。其中 * 匹配一个单词,# 匹配零个或多个单词。
        使用场景:适合于复杂的消息路由逻辑,尤其是当需要灵活地路由消息到多个消费者时。比如,路由所有来自美国或者欧洲的订单信息,可以使用类似 *.us.* 或 *.eu.* 的模式。

3. 扇形交换机(Fanout Exchange)
        功能:扇形交换机忽略路由键,直接将消息广播到所有绑定到该交换机的队列上。
        使用场景:当你想向多个消费者同时发送相同的消息时非常适合。例如,实时更新或广播通知系统。

4. 头信息交换机(Headers Exchange)
        功能:头信息交换机允许你匹配消息头部属性而不是路由键来进行消息路由。它提供了更大的灵活性,因为可以设置复杂的匹配规则,包括AND和OR操作。
        使用场景:适用于需要更复杂过滤条件的消息路由,特别是在需要考虑多于一个参数的情况下。

5. 默认交换机
        虽然严格意义上不被视为一种独立类型,但 RabbitMQ 提供了一个默认的无名交换机(也称为“匿名”交换机)。当你在声明队列时没有指定交换机,消息会通过这个默认交换机直接路由到指定名称的队列。这实际上是一个直连交换机,它的特殊之处在于它是隐式的,且每个队列都自动绑定到它,路由键就是队列的名字。


RabbitMQ使用

1.安装RabbitMQ:RabbitMQ: One broker to queue them all | RabbitMQ
1.引入依赖
        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2.配置文件(生产者和消费者服务都要配置)
server:port: 9301
spring:application:name: test-servicerabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest
3.配置交换机以及绑定队列

        在 RabbitMQConfig 中,我们通过 @Bean 方法定义并返回交换机(Exchange)、队列(Queue)以及绑定(Binding)。这些配置会被 Spring 自动注册到 RabbitMQ 中。

  • 交换机名:在配置中定义的交换机名(return new XxxExchange("交换机名"))会被 Spring 注册到 RabbitMQ 中,决定了消息指定发送到配置的哪一个交换机上。
  • 队列名:队列名(如 direct.queue、topic.queue 等)也会被注册到 RabbitMQ 中,在后续消费监听中被用于指定监听的队列。
  • 绑定:通过 BindingBuilder 将队列绑定到交换机,并指定路由键(Routing Key)或匹配规则。

        这些配置的目的是在 RabbitMQ 中创建好交换机和队列,并建立它们之间的关系。

@Configuration
public class RabbitMQConfigure {// Direct Exchange@Beanpublic DirectExchange directExchange() {return new DirectExchange("direct.exchange");}@Beanpublic Queue directQueue() {return new Queue("direct.queue");}@Beanpublic Binding directBinding() {return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct.routingKey");}// Topic Exchange@Beanpublic TopicExchange topicExchange() {return new TopicExchange("topic.exchange");}@Beanpublic Queue topicQueue() {return new Queue("topic.queue");}@Beanpublic Binding topicBinding() {return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("topic.*");}// Fanout Exchange@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("fanout.exchange");}@Beanpublic Queue fanoutQueue1() {return new Queue("fanout.queue1");}@Beanpublic Queue fanoutQueue2() {return new Queue("fanout.queue2");}@Beanpublic Binding fanoutBinding1() {return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange());}@Beanpublic Binding fanoutBinding2() {return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange());}// Headers Exchange@Beanpublic HeadersExchange headersExchange() {return new HeadersExchange("headers.exchange");}@Beanpublic Queue headersQueue() {return new Queue("headers.queue");}@Beanpublic Binding headersBinding() {return BindingBuilder.bind(headersQueue()).to(headersExchange()).where("headerKey").matches("headerValue");}
}
4.发送消息

        在发送消息时,我们使用 RabbitTemplate 的 convertAndSend 方法,并通过第一个参数指定交换机的名称。

public void convertAndSend(String exchange, String routingKey, Object object)

  • exchange: 指定消息发送到的交换机名称。
  • routingKey: 指定消息的路由键,用于决定消息如何路由到队列。
  • message: 要发送的消息内容。

        发送消息时,交换机的名称必须与配置中定义的交换机名一致。

        路由键的使用方式取决于交换机的类型(如 Direct、Topic、Fanout 等),FanoutExchange不注重路由键,不用设置。而TopicExchange和DirectExchange的区别在于路由键支持模糊匹配,而DirectExchange是直接指定路由键。

@Service
public class MessageSender {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendDirectMessage(String message) {rabbitTemplate.convertAndSend("direct.exchange", "direct.routingKey", message);}public void sendTopicMessage(String message) {rabbitTemplate.convertAndSend("topic.exchange", "topic.routingKey", message);}public void sendFanoutMessage(String message) {rabbitTemplate.convertAndSend("fanout.exchange", "", message);}public void sendHeadersMessage(String message) {MessageProperties properties = new MessageProperties();properties.setHeader("headerKey", "headerValue");Message msg = new Message(message.getBytes(), properties);rabbitTemplate.convertAndSend("headers.exchange", "", msg);}
}
5.接收消息

        @RabbitListener(queues = "队列名")

        我们使用 @RabbitListener 注解,指定队列名来监听队列收到的消息,而不是交换机,当消息被路由到该队列时,监听方法会自动触发并处理消息。

@Service
public class MessageReceiver {@RabbitListener(queues = "direct.queue")public void receiveDirectMessage(String message) {System.out.println("Received direct message: " + message);}@RabbitListener(queues = "topic.queue")public void receiveTopicMessage(String message) {System.out.println("Received topic message: " + message);}@RabbitListener(queues = "fanout.queue1")public void receiveFanoutMessage1(String message) {System.out.println("Received fanout message 1: " + message);}@RabbitListener(queues = "fanout.queue2")public void receiveFanoutMessage2(String message) {System.out.println("Received fanout message 2: " + message);}@RabbitListener(queues = "headers.queue")public void receiveHeadersMessage(String message) {System.out.println("Received headers message: " + message);}
}

6.使用流程总结

        Config 配置:定义交换机、队列和绑定关系,这些配置会被注册到 RabbitMQ 中。

        发送消息:通过 RabbitTemplate 指定交换机名称和路由键,将消息发送到交换机。

        监听消息:通过 @RabbitListener 监听队列。

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

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

相关文章

平方矩阵问题

Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…

电子电气架构 --- 智能座舱和车载基础软件简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人生是一场骗局,最大的任务根本不是什么买车买房,也不是及时行乐,这就是欲望,不是理想,是把自己对生命的希望寄托在外物上,正确的做法应该是内…

Qt 通过MSVC编译运行项目

第一步下载Qt 把Qt能选的插件都选上&#xff0c;有的是连接数据库必须得插件&#xff0c;有的是做图表必须得插件&#xff0c;有的是运行MSVC必须得插件&#xff0c;能选尽量都选上。 第二步安装VS2017&#xff0c;当然我们安装2017的目的主要是用C的编译器&#xff0c;这里提…

高效手机检测:视觉分析技术的优势

在当今社会&#xff0c;手机已成为人们日常生活和工作中不可或缺的工具。然而&#xff0c;在某些特定场合&#xff0c;如考场、工作场所等&#xff0c;手机的使用却可能带来负面影响。因此&#xff0c;如何有效监测和防止在这些场合偷用手机的行为&#xff0c;成为了一个亟待解…

Gitee重新远程连接仓库(Linux)

Gitee重新远程连接仓库&#xff08;Linux&#xff09; 因为虚拟机重新安装了一回&#xff0c;所以需要重新和远程仓库连接&#xff0c;在网上找了很久没有找到相关操作&#xff0c;自己实操成功&#xff0c;记录下本博客&#xff0c;帮助有需要的人 确保新虚拟机安装Git 在新虚…

【论文笔记】FFA-Net: Feature Fusion Attention Network for Single Image Dehazing

文章目录 1. 研究背景2. FFA - Net网络结构3. 实验结果4. 研究贡献5. 重点详解1. 通道注意力&#xff08;Channel Attention, CA&#xff09;通道注意力的实现步骤&#xff1a; 2. 像素注意力&#xff08;Pixel Attention, PA&#xff09;像素注意力的实现步骤&#xff1a; 3. …

计算机视觉cv2入门之图像的读取,显示,与保存

在计算机视觉领域&#xff0c;Python的cv2库是一个不可或缺的工具&#xff0c;它提供了丰富的图像处理功能。作为OpenCV的Python接口&#xff0c;cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV 图像格式 BMP格式 …

深度学习中的向量的样子-DCN

深度学习中向量都是 竖着的&#xff0c;譬如 DCN中的计算逻辑

OBS推WebRTC流,并添加毫秒级时间显示

作者在用OBS推WebRTC流&#xff0c;并用浏览器观看推送的实时流。另外就是想看一下延迟有多少。采用一台电脑&#xff0c;流媒体服务器为SRS&#xff0c;相关配置比较简单&#xff0c;可以自行搜索。 推送的流 http://localhost:1985/rtc/v1/whip/?applive&streamlivestr…

【MySQL】多表操作 —— 外键约束

目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…

82.HarmonyOS NEXT 性能优化指南:从理论到实践

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 性能优化指南&#xff1a;从理论到实践 文章目录 HarmonyOS NEXT 性能优化指南&#xff1a;从理论到实践1. 性能优化概述1.1 性能指…

树莓派急速安装ubuntu;映射磁盘与储存磁盘文件;ubuntu映射整个工程;保存系统工作状态

一、用途 在使用树莓派上下载ubuntu时&#xff0c;需要一张sd卡&#xff0c;当你需要给这张卡做备份的时候&#xff0c;可以是使用磁盘映射软件&#xff0c;从而达到备份的目的 同时有一些大佬发布了ubuntu的映射文件&#xff0c;可以直接使用该文件&#xff0c;然后还原他的整…

Qt 控件概述 QPushButton 与 QRadioButton

目录 QPushButton setIcon 设置图标 setShortCut 设置快捷键 setAutoRepeat : 设置是否连发 ​编辑RadioButton 槽函数 单选按钮的分组排异 QPushButton QPushButtoon继承于QAbstractButton(抽象类)&#xff1b; QAbstract中与QPushButton关联性极大的属性 ​ setIcon…

HR9110 玩具单通道直流电机驱动器

1、描述 HR9110是应用于直流电机方案的单通道H桥驱动器芯片。HR9110的H桥驱动部分采用低导通电阻的PMOS和NMOS功率管。低导通电阻保证芯片低的功率损耗&#xff0c;使得芯片安全工作更长时间。此 外HR9110拥有低待机电流、低静态工作电流。这些性能使能HR9110易用于玩具方案。…

Mac 使用 Crossover 加载 Windows Steam 游戏库,实现 Windows/Mac 共享移动硬盘

Mac 使用 Crossover 加载 Windows Steam 游戏库&#xff0c;实现 Windows/Mac 共享移动硬盘 1. 在Crossover上安装Steam2. Steam容器加载移动硬盘3. 配置Steam库 前言&#xff1a;本文介绍了如何在Crossover上安装Steam并加载外接移动硬盘&#xff0c;实现在Window上下载的游戏…

ubuntu 24 安装 python3.x 教程

目录 注意事项 一、安装不同 Python 版本 1. 安装依赖 2. 下载 Python 源码 3. 解压并编译安装 二、管理多个 Python 版本 1. 查看已安装的 Python 版本 2. 配置环境变量 3. 使用 update-alternatives​ 管理 Python 版本 三、使用虚拟环境为项目指定特定 Python 版本…

沐数科技数据开发岗笔试题2025

描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值&#xff08;均值&#xff09;之间的偏离程度。标准差越大&#xff0c;表明数据的分布越分散&#xff1b;标准差越小&#xff0c;表明数据…

ChatGPT-4

第一章&#xff1a;ChatGPT-4的技术背景与核心架构 1.1 生成式AI的发展脉络 生成式人工智能&#xff08;Generative AI&#xff09;的演进历程可追溯至20世纪50年代的早期自然语言处理研究。从基于规则的ELIZA系统到统计语言模型&#xff0c;再到深度学习的革命性突破&#x…

vulkanscenegraph显示倾斜模型(5.3)-相机

前言 在Vulkan中&#xff0c;相机的概念并非由API直接提供&#xff0c;而是由应用程序实现。相机的核心功能包括视图变换和投影变换&#xff1a;视图变换将世界坐标系中的物体转换到相机坐标系&#xff0c;投影变换则将相机坐标系中的物体转换到投影空间。在VSG&#xff08;Vul…

【Pycharm】Pycharm无法复制粘贴,提示系统剪贴板不可用

我也没有用vim的插件&#xff0c;检查了本地和ubutnu上都没有。区别是我是远程到ubutnu的pycharm&#xff0c;我本地直接控制windowes的pycharm是没问题的。现象是可以从外部复制到pycharm反之则不行。 ctl c ctlv 以及右键 都不行 参考&#xff1a;Pycharm无法复制粘贴&…