RabbitMQ:基础篇

news2024/9/24 21:27:19

1.RabbitMQ是高性能的异步通讯组件

何为异步通讯

        打电话就是同步通讯,微信聊天可以理解为异步通讯,不是实时的进行通讯:时效性差。

同步调用的缺点:

拓展性差(需求不尽提)

性能下降        

级联失败

优势:时效性强,等到结果再返回

异步调用

异步调用是基于消息通知形式实现,一般包含三个角色:消息发送者 消息代理 消息接收者

消息代理:负责管理转存转发消息

优势:解除耦合,拓展性强

无需等待,性能好

故障隔离

缓存消息、削峰填谷

缺点:不能立即得到结果

不确定下游服务是否成功

依赖某一个业务

技术选型

2.RabbitMQ基本介绍

MQ整体架构及核心概念

  • publisher:消息发送者

  • consumer:消息的消费者

  • queue:队列,存储消息

  • virtual-host:虚拟主机,起到数据隔离作用

  • exchange:交换机,负责路由消息

3.数据隔离

在MQ中创建虚拟主机实现数据隔离

4.SpringAMQP

AMQP:消息通信协议与语言无关,更符合微服务中独立性的要求

Spring AMQP:基于AMQP协议定义的API规范,提供模板来发送和接受消息。->spring rabbit默认实现

AMQP依赖:父工程加入依赖

配置文件:每个微服务端引入MQ服务的信息

发送消息:RabbitTemplate.converAndSend(队列名,消息体内容)

消息接受:

4.1 WorkQueue

实现一个队列绑定多个消费者

默认情况下,RabbitMQ会将消息依次轮询投递给绑定在队列上的每一个消费者,但并不会考虑消费者是否处理完消息,可能会出现消息堆积

可以通过修改配置文件,设置preFetch为1,确保同一时刻最多传递给消费者1条消息

Work模型的使用:

1.多个消费者绑定到一个队列,可以加快消息的处理速度

2.同一条消息只会被一个消费者处理

3.通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

4.2 Fanout交换机

fanout的交换机会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式

交换机的作用:

接收生产者发送的消息

将消息按照规则路由到与之绑定的队列

Fanout交换机会将消息路由到每个绑定的队列

4.3 Direct交换机

Direct交换机会将接受到的消息根据规则路由指定的queue,因此称为定向路由

每一个queue都与exchange设置一个BindingKey

发布者发送消息时,指定消息的RoutingKey

Exchange将消息路由到 BKey和Rkey一致的队列

 生产者:

4.4 Topic交换机

与Direct交换机类似,区别在于routingKey可以是多个单词的列表,并且以.分割

queue与exchange指定bindingKey时,可以使用通配符:

*:代指一个单词;#:代指0个或多个单词

描述二者差异:

direct的routingKey必须是具体topic可以是多个单词,用.分割,并且队列与交换机绑定时的routingkey可以使用通配符

4.5 用java代码声明队列和交换机

SpringAMQP提供几个类,用来声明队列、交换机及其绑定关系

代码demo:

除了上述基于Bean形式声明队列和交换机还有一种方便的方式:

4.6 消息转换器

Spring的对消息对象的处理是由MessageConverter来处理的,而默认实现是simpleMessageConverter,基于JDK的ObjectOutputStream

有几个问题:

  • JDK的序列化有安全性问题
  • JDK序列化的消息太大
  • JDK序列化的消息可读性差

推荐使用JSON序列化代替默认的JDK序列化:

publisher和consumer都要引入jackson依赖

publisher和consumer配置messageConverter

5.消息传输可靠性

5.1 生产者可靠性

5.1.1 生产者重连

利用重试机制可有效提高消息发送的成功率,不过SpringAMQP提供的重试机制是阻塞式的重试,线程是被阻塞的,会影响到业务性能

5.1.2 生产者确认

原理:

代码具体实现:

在生产者微服务中添加配置:

每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目启动过程中配置:

Confirmcallback 发消息

demo:

  • 生产者确认需要额外的资源,尽量不使用
  • 如果一定使用,无需开启Publisher-Return机制,因为一般路由失败是业务问题
  • 对于nack消息可以有限次重试,依然失败则记录异常信息

5.2 MQ的可靠性

5.2.1 数据持久化

在默认情况下,RabbitMQ会将收到的信息保存到内存中以降低消息收发的延迟。这样会导致俩个问题:

  • 一旦MQ宕机,内存的消息就会丢失
  • 内存空间有限,消费者发生故障或处理过慢,会导致消息积压,引发MQ阻塞

实现数据持久化:

交换机持久化
 队列持久化

 消息持久化

5.2.2 Lazy Queue

从MQ3.6.0版本之后,引入懒惰队列的概念,懒惰队列的特征:

1、接收到消息不保存到内存中,而是存入磁盘(内存只保留最近的消息,默认是2048条)

2、消费者要消费信息时才会从磁盘读取消息

3、支持百万级别的消息存储

3.12版本之后队列只有懒惰队列,无法更改

配置方法:
 

5.3 消费者的可靠性

为了确认消费者是否成功处理消息,MQ提供了消费者确认机制,当消费者处理消息结束后,应该向MQ发送一个回执,告知自己的消息处理状态。回执有三种:

ack、nack、reject

5.3.1 消费者确认机制

SpringAMQP已经实现了消息确认功能,通过配置文件选择ACK处理方式:

 5.3.2 消费失败处理
失败重试机制:

当消费者出现异常后,消息会不断requeue到队列,再重新发送给消费者,无限循环,导致MQ的消息处理飙升,带来不必要的压力

失败消息处理策略:

在开启重试模式后,重试次数耗尽,需要MessageRecoverer接口来处理

消费者如何保证消息一定被消费

开启消费者确认机制为Auto,由Spring确认消息并返回ack或者其他;

开启失败重传机制后,并设置了MessageRecoverer,多次重传失败后将消息投递给指定的交换机

5.3.3 业务幂等性

同一个业务,执行一次或多次对业务状态的影响是一致的

天生幂等业务:查询业务、删除业务

唯一消息id

源码:

第二种方案就是根据业务实现:

比如说修改订单状态,想要从已支付变成未支付的情况下,可以不用设置uuid,而是在改状态前加一个判断状态的实现就可以了。


6. 延迟消息

生产者发送消息时指定一个时间,消费者不会立刻收到消息而是等待时间之后才收到消息

6.1 死信交换机

如果一个队列通过dead-letter-exchange属性指定了一个交换机,那么该队列中的死信就会指定给这个交换机,这个交换机就是死新交换机

使用场景:

控制台实现绑定死信交换机

发送消息:需要用到消息后置处理器要不然抛异常~

消费者

6.2 延迟消息插件

MQ官方推出一个插件,原生支持延迟消息功能。其原理是设计一种支持延迟消息功能的交换机,当消息投递给交换机后可以暂存一定时间,到期后再投递给交换机。

装好插件之后,交换机加参数:

发送消息实现:

6.3 取消超时订单

首先来说这个延迟消息的发送时间的确定是根据具体业务实现,就比如说针对取消超时订单的场景下,用户支付确认之后有30min的时间进行支付,那么我们可以设置一个数组,每个数组的元素就是延迟消息,第一个是10s、10s、10s、30s、30s、1min.....这样的形式来优化延迟消息的发送。

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

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

相关文章

实时高清无延迟:EasyDSS/EasyCVR无人机直播技术重塑赛事新体验

近日有网友发视频称,在内蒙古呼伦贝尔一景区的马术表演现场,一架无人机擅自在场地上空飞行拍摄。现场工作人员多次制止飞行无果,一名表演者骑马用弓箭将无人机射落。 在数字科技日新月异的今天,无人机直播推流技术以其独特的视角…

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主&#x…

字节跳动十年经验老鸟,耗时大半年整理的软件测试面试真题【附答案】

软件测试工程师,和开发工程师相比起来,虽然前期可能不会太深,但是涉及的面还是比较广的。前期面试实习生或者一年左右的岗位,问的也主要是一些基础性的问题比较多。涉及的知识主要有MySQL数据库的使用、Linux操作系统的使用、软件…

回溯算法的去重问题

概述 在利用回溯算法去求子集、排列、组合等问题时,所给数组中如果包含重复元素,需要进行去重操作。常用的去重方法是使用used数组或集合。 对于上述子集、排列、组合等问题的求解方法是将数组转化为树的形式,利用递归和回溯的方法进行求解…

10.1 JSP语言入门

JSP语言入门 目录一、 基础概念1. 什么是JSP?2. 工作原理3. 基本语法 二、 表达式语言(EL)1. 简介2. 语法 三、 JSTL(JSP Standard Tag Library)1. 简介2. 核心标签库3. 常用标签 四、 高级话题1. 会话管理2. 自定义标…

卷积神经网络(一)-LeNet-5

前言 LeNet开启了卷积神经网络的第一枪,这一网络模型由Yann LeCun等人在1998年提出,被视为卷积神经网络的开山之作。 论文地址: http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf 如果打不开就看csdn: https://download.…

LangChain-v0.2 Build an Agent 构建代理

语言模型本身不能采取行动,它们只是输出文本。LangChain的一个重要用例是创建代理。代理是使用LLM作为推理引擎来确定要采取哪些行动,以及传递哪些输入的系统。执行操作后,可以将结果反馈到LLM中,以确定是否需要更多操作&#xff…

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展,陪玩服务应远而生并迅速唱起,陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁,其模式系统的搭建与开发是得尤为重要,本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程,包…

基础动态规划题目基础动态规划题目

目录 题目1: P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles 代码示例: 题目2: Common Subsequence 代码示例 题目3 :最长上升子序列 最长不下降子序列 最长上升子序列oj答案 题目1: P1216 [USACO1.5]…

Linux热键,shell含义及权限介绍

君子忧道不忧贫。 —— 孔丘 Linux操作系统的权限 1、几个常用的热键介绍1、1、[Tab]键1、2、[ctrl]-c1、3、[ctrl]-d1、4、[ctrl]-r 2、shell命令以及运行原理3、权限3、1、什么是权限3、2、权限的本质3、3、Linux中的用户3、4、Linux中文件的权限3、4、1、快速掌握修改权限的…

华为HCIP Datacom H12-821 卷41

1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述,正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…

古玻璃制品的成分分析与鉴别详解【国一,附完整代码】

声明:2024年数模国赛即将来临,为助力国赛和钉钉杯,我将重温22年小样本国赛C题和23年大样本国赛C题,给出详细思路和完整代码,供广大数模爱好者阅览,如需比赛指导,请联系文章底部卡片咨询。 未经允…

UNiapp微信小程序Ucharts

效果图如下 以上为加载接口所得数据的玫瑰图与折线图 具体步骤如下 1,将插件导入Hbuiler 所需要的项目中(插件地址:秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场) 2,导入成功是这样的 3&#xff0c…

Windows终端远程登陆Linux服务器(SSH+VScode)

W i n d o w s 终端远程登陆 L i n u x 服务器( S S H V S c o d e ) \huge{Windows终端远程登陆Linux服务器(SSHVScode)} Windows终端远程登陆Linux服务器(SSHVScode) 文章目录 写在前面通过SSH远程连接L…

rust + python+ libtorch

1: 环境,ubuntu 1.1 rust : rust-1.79.0 (在官方下载linux版本后,解压文件夹,内部有个install的sh文件,可安装) 安装成功测试:cargo --version 1.2 python3.10 (直接使用apt install pytho…

Redis-基础概念

目录 概念 Redis是什么 Redis 和 MySQL 的区别? Redis单线程有什么极端场景的瓶颈 Redis为什么快? 为什么Redis是单线程? Redis是单线程还是多线程 Redis为什么选择单线程做核心处理 Redis6.0之后引入了多线程,你知道为什么吗? 瓶颈是内存和I…

SAP PP学习笔记28 - 生产订单的收货及品质管理

上一章讲了生产订单的很多概念,比如确认(报工)以及报工的各种形式,反冲,自动入库等。 SAP PP学习笔记27 - Confirmation(报工/确认)(CO11,CO11N,CO15,CO12),…

IOS系统有什么好用的藏语翻译软件推荐吗?

藏语翻译通是我使用过的比较好用实用的藏语翻译软件。 藏语翻译通是一款专为藏语和汉语互译设计的智能翻译软件,它利用最新的人工智能技术,为用户提供高效、准确的翻译服务。软件界面简洁直观,易于操作,无论是藏语学习者、研究者…

C++中的变量的同名隐藏

同名隐藏是C中的一个概念,在一个类的继承关系中,子类中定义了一个与父类中同名的成员函数。当这种情况发生时,子类中的函数会隐藏掉所有父类中同名的函数,这意味着在子类中调用这个函数时,会优先调用子类中定义的版本&…

图书馆定位导航:RFID、VR与AR技术在图书馆中的应用

图书馆作为知识的宝库,承载着无数求知者的梦想与期待,随着馆藏书籍数量的激增与图书馆布局的日益复杂,读者在寻找目标书籍往往有许多困难。传统的索引号查询方式虽能提供书籍的基本信息,但在寻找过程中,因不熟悉图书馆…