【RabbitMQ】RabbitMQ基础认识

news2025/2/7 7:17:17

文章目录

  • 前言
  • 初识MQ
    • SpringAMQP如何首发消息?
    • 消费者
    • 交换机
      • Fanout:广播
      • Direct交换机
      • Topic交换机
      • 声明队列和交换机
  • 总结

前言

微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们成这种调用方式为同步调用,也可以叫同步通讯。但在很多场景下,我们可能需要采用异步通讯的方式,为什么呢?
同步通信和异步通信(如下图):
● 同步通讯:就如同打视频电话,双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。
● 异步通讯:就如同发微信聊天,双方的交互不是实时的,你不需要立刻给对方回应。因此你可以多线操作,同时跟多人聊天。

两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发微信可以同时与多个人收发微信,但是往往响应会有延迟。

所以,如果我们的业务需要实时得到服务提供方的响应,则应该选择同步通讯(同步调用)。而如果我们追求更高的效率,并且不需要实时响应,则应该选择异步通讯(异步调用)。
在这里插入图片描述

初识MQ

整体架构及核心概念
● publisher:消息发送者
● consumer:消息的消费者
● queue:队列,存储消息
● exchange:交换机,负责路由消息
● virtual-host:虚拟注解,起到数据隔离的作用

在这里插入图片描述

SpringAMQP如何首发消息?

1、引入spring-boot-starter-amqp依赖
2、配置rabbitmq服务端信息
3、利用RabbitTemplate发送消息
4、利用@RabbitListener注解声明要监听的队列,监听消息

消费者

默认情况下,RabbitMQ会将消息依次轮询投递给绑定在队列上的每一次消费者。并没有考虑到消费者是否已经处理完消息,可能出现消息堆积情况。需要修改application.yml,设置preFetch值为1,确保同一时刻最多投递给消费者1条消息

spring:
  rabbitmq:
    host: localhost
    port: 5672
    virtual-host: /
    username: admin
    password: admin
    listener:
      simple:
        prefetch: 1  # 每次只能获取一条消息,处理完成之后才能获取下一个消息

Work模型的使用:
● 多个消费者绑定到一个队列,可以加快消息处理速度
● 同一条消息只会被一个消费者处理
● 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

交换机

真正生产环境都会经过exchange:来发送消息,而不是直接发送到队列,交换机的类型有以下三种:
● Fanout:广播
● Direct:定向
● Topic:话题

Fanout:广播

Fanout Exchange会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式
在这里插入图片描述

void testSendFanout() {
        String exchangeName = "hmall.fanout";
        String msg = "hello, everyone!";
        rabbitTemplate.convertAndSend(exchangeName, null, msg);
    }

hmall类型的交换机上绑定了2个队列
在这里插入图片描述
在这里插入图片描述
交换机作用:
● 接收oublisher发送的消息
● 将消息按照规则路由到与之绑定的队列
● FanoutExchangel的会将消息路由到每个绑定的队列

Direct交换机

Direct Exchange会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由。
● 每一个Queue都与Exchange设置一个BindingKey
● 发布者发送消息时,指定消息的RoutingKey
● Exchange:将消息路由到BindingKey与消息RoutingKey一致的队列
在这里插入图片描述

Topic交换机

TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以“.”分割。
Queue与Exchange指定BindingKeyl时可以使用通配符:
● #代表0个或多个单词
● *代表一个单词

在这里插入图片描述

声明队列和交换机

SpringAMQP提供了几个类,用来声明队列、交换机及其绑定关系:
● ·Queue:用于声明队列,可以用工厂类QueueBuilder构建
● Exchange:用于声明交换机,可以用工厂类ExchangeBuilder构建
● Binding:用于声明队列和交换机的绑定关系,可以用工厂类BindingBuilder构建

队列和交换机是在消费者方进行声明

@Configuration
public class FanoutConfiguration {
    // 声明交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        // ExchangeBuilder.fanoutExchange("").build();
        return new FanoutExchange("hmall.fanout2");
    }
    // 声明队列
    @Bean
    public Queue fanoutQueue3(){
        // QueueBuilder.durable("ff").build();
        return new Queue("fanout.queue3");
    }

    @Bean
    public Binding fanoutBinding3(Queue fanoutQueue3, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue3).to(fanoutExchange);
    }

    @Bean
    public Queue fanoutQueue4(){
        return new Queue("fanout.queue4");
    }

    @Bean
    public Binding fanoutBinding4(){
        return BindingBuilder.bind(fanoutQueue4()).to(fanoutExchange());
    }
}

SpringAMQP:还提供了基于@RabbitListener注解来声明队列和交换机的方式
在这里插入图片描述

总结

在RabbitMQ的基础部分,我们了解了如何利用消息队列来实现应用程序之间的可靠通信。通过RabbitMQ,我们可以轻松地实现生产者-消费者模式,确保消息的可靠传递,并实现解耦和可扩展性。

总的来说,RabbitMQ具有以下几个关键特点和优势:

消息队列模型:RabbitMQ采用了先进的AMQP协议,提供了灵活且可靠的消息队列模型,支持多种消息传递模式。
可靠性:RabbitMQ具有高度的可靠性,能够确保消息的传递和处理,即使在生产者或消费者发生故障的情况下也能够保证消息不丢失。
灵活性:RabbitMQ支持多种消息传递模式,包括点对点、发布/订阅、路由和主题等,可以根据具体需求选择最合适的模式。
解耦和可扩展性:通过引入消息队列,可以将系统中的各个组件解耦,从而提高系统的可维护性和可扩展性,同时也能够减少系统之间的依赖性。
性能优化:RabbitMQ提供了丰富的性能优化选项,包括消息持久化、消息优先级、消息确认和流控制等,可以根据具体场景进行灵活配置。
在使用RabbitMQ时,需要注意以下几点:

消息持久化:确保重要的消息被持久化到磁盘,以防止消息丢失。
错误处理:处理消息传递过程中可能出现的错误,包括消息投递失败、消费者处理失败等情况。
监控和管理:定期监控RabbitMQ的性能指标,及时发现并解决潜在的问题,保证系统的稳定运行。
安全性:采取必要的安全措施,保护RabbitMQ服务器免受未经授权的访问和攻击。
综上所述,RabbitMQ作为一种可靠、灵活和高性能的消息队列系统,为构建分布式应用程序提供了强大的支持。通过合理的设计和配置,可以充分发挥其优势,提高系统的可靠性、可维护性和可扩展性,从而实现更加稳定和高效的应用程序。

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

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

相关文章

【五十一】【算法分析与设计】KMP 算法,KMP 算法的作用,KMP 算法流程,KMP 算法证明,KMP 算法代码

目录 KMP 算法的作用,解决的问题 KMP 算法的流程 Next 数组 KMP 算法正式过程 KMP 算法的证明过程 Next 数组的求法 Next 数组求法的证明过程 KMP 算法代码 结尾 KMP 算法的作用,解决的问题 1. 首先给你一个字符串 str,然后又给你…

酷开系统丨酷开科技打造P9系列智能投影,让智能化更进一步

近些年,随着科技的进步,家用投影仪已经成为家庭娱乐中不可或缺的一部分。尤其对年轻人来说,他们更喜欢在巨幕上看电影、玩游戏或听歌唱歌,投影仪在巨幕上的光影效果确实能带来更好的沉浸感体验,但这也是需要强大的系统…

OpenHarmony实战开发-页面深色模式适配。

介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 1. 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值…

零基础也可以学习的医疗设备维修技能

零基础也可以学习的维修技能 解锁工程师的隐藏潜能! 您是否曾因维修问题而感到束手无策? 彩虹医疗影像培训课程不仅提供技能, 更能为您提供自信。不再需要依赖他人, 您将成为故障排查的行家。迎接更具挑战性的机会&#xff0…

C#引用外部组件的常用方法

我们在开发程序过程中,时常会使用到第三方组件,比如一些通信、UI组件等。常用的引用方法有下面几种。 01 NuGet引用 NuGet是.NET的一个包管理平台,很多开源组件会通过NuGet进行管理和发布。比如我们常用的S7NetPlus等。 从NuGet中引用组件…

鸿蒙OS开发指导:【应用包签名工具】

编译构建 该工具基于Maven3编译构建,请确认环境已安装配置Maven3环境,并且版本正确 mvn -version下载代码,命令行打开文件目录至developtools_hapsigner/hapsigntool,执行命令进行编译打包 mvn package编译后得到二进制文件&…

(python)远程操作模块-Paramiko

目录 前言 安装 流程 范例 优点 缺点 需要注意的事项 前言 Paramiko 是一个用于 Python 的模块,用于实现 SSH 客户端和服务器。使用 Paramiko,你可以在 Python 中进行 SSH 连接,并执行远程命令、传输文件等操作。 安装 pip install p…

[leetcode] max-area-of-island

. - 力扣(LeetCode) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水&…

模仿SpringSecurity配置文件的写法对mybatisPlus查询方法的改造

使用mybatisPlus查询数据的传统流程是:Autowired mapper对象。new Wrapper 一通乱set Wrapper ,select xxx。但实际开发中,还有很大的改进空间,一是一些脆弱的参数设置有多处,得不到妥善维护,二是代码编写丑陋难看。因…

重生奇迹mu怎么转职

一转:一转的等级是180级,要求就是材料帝王之书收集2本,还需要7万金币就可以直接转职了,帝王之术就是任务了,在任务那里可以看到转职任务,我们只要做了转职任务就可以收集完了,一转分别叫做&…

springboot直接运行 java-jar

一、问题 springboot 为什么能通过java-jar运行,打包的时候也把tomcat打了吗? 二、解答 Spring Boot 应用程序通常打包成可执行的 JAR 文件,并且可以通过 java -jar 命令来运行。这是因为 Spring Boot 在打包时会将应用程序本身和嵌入的 T…

振弦式渗压计的安装与防护:在水工建筑物中的关键应用

振弦式渗压计,作为一种高效的孔隙水压力或液体液位测量工具,广泛应用于水工建筑物、基岩内、测压管、钻孔、堤坝、管道和压力容器内。其安装和防护工作至关重要,直接关系到测量数据的准确性和仪器的使用寿命。本文将重点探讨振弦式渗压计在填…

武汉星起航引领跨境电商新浪潮,与亚马逊携手共拓全球市场

在全球贸易日益繁荣的当下,跨境电商行业正迎来前所未有的发展机遇。武汉星起航电子商务有限公司,作为跨境电商领域的佼佼者,凭借其前瞻性的战略布局和强大的运营能力,与亚马逊跨境电商平台紧密合作,共同推动全球贸易的…

【C语言】<动态内存管理>我的C语言终末章

<动态内存管理> 1. 为什么要有动态内存分配2. malloc和free2.1 malloc2.2 free 3. calloc和realloc3.1 calloc3.2 realloc 4.常见的动态内存错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释…

为什么公司在访问控制中转向人工智能

门禁系统通过帮助维护安全和保护资产来实现基本功能。另一方面,传统的访问控制方法有许多缺点,可能不如理想情况下有效。人工智能 (AI) 正成为企业改进访问控制措施的越来越受欢迎的选择,作为弥补上述缺陷的一种手段。…

区块链安全-----接口测试-Postman

Postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易 用性好 。无论是开发人员进行接口调试,还是测试人员做接口测试,Postman都是我们的首选工具 之一 。 更早的接入测试,更早的发现问…

Matroska解封装原理与实践

本期作者 背景 Matroska是一种开放标准、功能强大的多媒体封装格式,可容纳多种不同类型的视频、音频及字幕流,其常见的文件扩展名为.mkv、.mka等。与应用广泛的MP4相比,Matroska更加灵活开放,可以同时容纳多个字幕,甚至…

B端:导航条长得不都一样吗?错了,这里看过来就懂了。

B端导航条看似都一样,大差不差,仔细看一下,其实各有各的不同,这里方向了十多个,大家仔细看细节。

使用TomCat在idea写一个可以实现分页查询的前后端学生项目04.12

使用TomCat在idea写一个前后端学生项目04.12项目包-CSDN博客 在前端界面需要引入的插件: 在该网站下载需要的插件 Maven Repository: Search/Browse/Explore (mvnrepository.com)https://mvnrepository.com/ 分页查询: 在前端jsp页面使用c:forEach c:…

LeetCode55题:跳跃游戏(原创)

【题目描述】 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1&am…