【RabbitMQ】RabbitMQ基础认识

文章目录

  • 前言
  • 初识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作为一种可靠、灵活和高性能的消息队列系统,为构建分布式应用程序提供了强大的支持。通过合理的设计和配置,可以充分发挥其优势,提高系统的可靠性、可维护性和可扩展性,从而实现更加稳定和高效的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四川古力未来科技抖音小店安全:保障您的购物体验,让每一笔交易都安心

在数字化浪潮席卷全球的今天,电子商务已经成为人们生活中不可或缺的一部分。四川古力未来科技抖音小店,作为新兴的电商力量,始终将顾客的安全放在首位,倾力打造安全、便捷、高效的购物平台,让每一位顾客在享受购物乐趣…

计算机网络(五)传输层

传输层 从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最低层 传输层功能: 传输层提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别区别是&#xf…

Python进阶编程 --- 2.MySQL、pymysql、PySpark

文章目录 第一章:SQL基础入门1.1 数据库数据库如何存储数据 1.2 数据库和SQL的关系1.3 MySQL版本1.4 命令提示符内使用MySQL1.5 SQL概述1.5.1 SQL语言分类1.5.2 SQL语言特性 1.6 DDL库管理表管理 1.7 DML - 数据操作1.8 DQL - 查询和计算数据1.8.1 基础数据查询1.8.…

【opencv】示例-videowriter_basic.cpp从默认摄像头视频采集和录制

这段代码的功能是使用OpenCV从默认摄像头捕获视频流,并将这些视频流实时写入到一个名为live.avi文件中。视频流以MJPG编码格式被写入,帧率设置为25帧每秒。程序还会通过一个窗口实时显示摄像头捕获的画面,窗口标题为"Live"。用户可…

6.GodotCanvasItem、Node2D及自定义节点

CanvasItem节点 CanvasItem节点,CanvasItem -> Node,所以CanvasItem继承了Node的所有功能Canvas是画布的意思,所以CanvasItem代表了就是可以被绘制的节点,可以设置可视化界面和材质的颜色所有的2D节点和GUI节点都继承于CanvasI…

科技云报道:AI大模型疯长,存储扛住了吗?

科技云报道原创。 AI大模型正在倒逼数字基础设施产业加速升级。 过去一年半,AI大模型标志性的应用相继出现,从ChatGPT到Sora一次次刷新人们的认知。震撼的背后,是大模型参数指数级的增长。 这种数据暴涨的压力,快速传导到了大模…

Vue 指令

Vue根据不同的指令&#xff0c;针对标签实现不同的功能 指令&#xff1a;带有v-前缀的特殊的标签属性 <!-- Vue指令--> <div v-html"str"></div><!-- 普通标签属性 --> <div class"box"></div> 目录 v-html v-sho…

Linux的学习之路:11、地址空间

摘要 本章主要是说一下地址空间&#xff0c;我也只是按照我的理解进行解释&#xff0c;可能说不清楚&#xff0c;欢迎指正 目录 摘要 一、空间布局图 二、代码测试一下 三、进程地址空间 四、测试代码 一、空间布局图 如下方图片可以看出地址空间有几种&#xff0c;这里…

论文笔记:Time Travel in LLMs: Tracing Data Contamination in Large Language Models

iclr 2024 spotlight reviewer评分 688 1 intro 论文认为许多下游任务&#xff08;例如&#xff0c;总结、自然语言推理、文本分类&#xff09;上观察到的LLMs印象深刻的表现可能因数据污染而被夸大 所谓数据污染&#xff0c;即这些下游任务的测试数据出现在LLMs的预训练数据…

java的深入探究JVM之内存结构

前言 Java作为一种平台无关性的语言&#xff0c;其主要依靠于Java虚拟机——JVM&#xff0c;我们写好的代码会被编译成class文件&#xff0c;再由JVM进行加载、解析、执行&#xff0c;而JVM有统一的规范&#xff0c;所以我们不需要像C那样需要程序员自己关注平台&#xff0c;大…

实景三维技术在公共安全领域的应用

随着科技的不断发展&#xff0c;实景三维技术在公共安全领域的应用越来越广泛。实景三维技术是指通过采集现实世界的三维数据&#xff0c;构建出真实的三维场景&#xff0c;进而实现对现实世界的数字化模拟和重建。在公共安全领域&#xff0c;实景三维技术的应用不仅可以提高安…

《云原生安全攻防》-- 云原生攻防矩阵

在本节课程中&#xff0c;我们将开始学习如何从攻击者的角度思考&#xff0c;一起探讨常见的容器和K8s攻击手法&#xff0c;包含以下两个主要内容&#xff1a; 云原生环境的攻击路径: 了解云原生环境的整体攻击流程。 云原生攻防矩阵: 云原生环境攻击路径的全景视图&#xff0…

服务器负载均衡SLB/加密原理

多台服务器提供相同的服务 SLB(server load balancing) 多台服务器对应一个虚拟地址&#xff0c;该地址是防火墙虚拟出来的。 服务器负载均衡功能仅支持IPV4协议 多通道协议仅支持FTP协议

逆向IDA中Dword,数据提取

我们可以看见数据是这样的&#xff0c;第一个是1cc 但是我们shifte就是 这个因为他的数据太大了&#xff0c;导致高位跑后面去了 这个时候&#xff0c;我们右键——convert——dword 这样就可以提取到争取的数据了 比如第一个数据 0x1cc a0xcc b0x1 print(hex((b<<8…

M系Mac关闭SIP

文章目录 M系Mac关闭SIP一&#xff1a;查看SIP状态二&#xff1a;关闭SIP步骤 M系Mac关闭SIP 一&#xff1a;查看SIP状态 1、使用终端 打开终端 输入csrutil status&#xff0c;回车 你会看到以下信息中的一个&#xff0c;指示SIP状态 已打开 System Integrity Protection s…

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

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

吴恩达llama课程笔记:第四课提示词技术

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

OpenCV表格图片寻找有效的x、y坐标并删除异常点

需求描述&#xff1a; 对表格图片&#xff0c;识别出表格里的横、纵坐标列表&#xff0c;并剔除异常点 解决方法&#xff1a; 通过opencv的getStructuringElement识别出横、竖线通过bitwise_and取得交点并去除表格线获取x和y的所有可能点&#xff0c;按照相邻点不超过阈值来筛…

6、JVM-JVM调优工具与实战

前置启动程序 事先启动一个web应用程序&#xff0c;用jps查看其进程id&#xff0c;接着用各种jdk自带命令优化应用 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jmap -histo 14660 #查看历史生成的实例 jmap -histo:live 14660 #查看当前存活的实…

Python程序设计 二维列表(二)

实验九 二维列表 1. 血压统计 血压的正常范围是 60mmHg<舒张压<90mmHg 90mmHg<收缩压<140mmHg 输入小张测量血压的日期&#xff0c;舒张压和收缩压&#xff0c;存放到列表xy中 将小张血压不正常次数百分比计算并显示出来 将小张血压不正常的日期&#xff0c;舒张…