RabbitMQ从入门到实战-3(高可靠性)
文章目录
- 发送者可靠性
- 发送者重连
- 发送者确认(一般不会开启)
- 指定returncallback和confrimfallback
- tips
- MQ可靠性
- 数据持久化
- LazyQueue(默认模式且不可更改)
- 消费者的可靠性
- 消费者确认机制
- 消费者失败重试
- 业务幂等性
- 唯一消息id
- 业务判断
- 延迟消息
- 死信交换机
- 延迟消息插件
前言
保证消息的到达是使用MQ的一个关键也是一个前提

MQ消息达不到数据库有三种可能
1.发送消息的支付服务因为网络波动等原因消息为发出去2.mq挂了,消息没转发出去3.交易服务挂了,没有收到信息
下面解决方案也是主要针对这三种情况进行解决
但就算解决也不能保证100%不丢失,所以会有一些二兜底方案-延迟消息

发送者可靠性
发送者重连
下面是发送者重连的配置,只需要在配置文件中配置即可(默认是不开启的)
很好理解
就是生产者和mq之间建立连接超时就算发送失败
等待时长就是你网络波动可能是一会,所以你等待一段时间再发的话成功概率更大
注意:阻塞等待充实会影响性能
发送者确认(一般不会开启)
发送者确认机制,就是发送者给RabbitMQ发消息,然后rabbitmq收到/没收到消息给予回应
发送者确认三种返回ACK情况
路由异常一般是我们没配队列queue或者说我们传入了错误的rounting key导致找不到queue,是由我们程序员自己导致的,但是消息确实发到交换机了所以会返回ACK
临时消息就是不需要持久化的,入队就会返回ack
持久化消息是入队且完成持久化才会返回ack
如何开启确认机制?
这里我们一般会选择none或者correlated
指定returncallback和confrimfallback
实操视频
returncallback用来定义返回信息的格式,而且多次配置无效
所以我们在配置类时候配置一次即可,到时候注入进去用就行
ConfrimCallBack
是在我们发送消息的时候去指定的,每一次发消息前都要指定
correlationData(ConfrimCallBack实体类)作为参数传入,有两个重要属性
1.id 不同confirm消息不同id
2.future 是再mq返回确认信息后会赋值到future内,而我们要做的是拿到future,添加一个回调函数(当future赋值完会自动调用)
addCallback传入一个ListenableFutureCallback对象
实现两个方法onFailure(没用)-代码处理future有异常执行的逻辑不是mq通知你失败了
onSuccess才是接收到mq返回消息执行的逻辑
这里mq返回信息可能为NACK也可能为ACK
tips
发送者·确认需要和mq通信会影响消息发送效率,一般不会开启这个机制,一般消息发送出现异常概率很低,你用发送者重连其实就差不多
MQ可靠性
问题
解决方案1.数据持久化2、Lazy Queue
数据持久化
交换机和队列默认创建时候就是持久化的不用改
SpringAMQP默认发送的消息也都是持久化的(convertAndSend方法)
持久化就是你存入内存的同时也会存到磁盘中,重启mq后,会去磁盘中读出持久化数据达到持久化目的
其实你就算指定消息为非持久化,当你内存上限后也会去写入磁盘中,此时MQ会阻塞专门将我们的临时消息写入磁盘
非持久化消息是到达管道上限后才会写入磁盘,且会阻塞MQ读消息
持久化消息是一开始就写入磁盘,是双线程执行,不会阻塞MQ读消息
所以在数据量非常大的时候,持久化消息甚至比非持久化消息效率更高
LazyQueue(默认模式且不可更改)
直接写入磁盘,消费者消费才弄到内存,防止IO过慢,会提前缓存一部分消息
注:3.12后所有队列但是Lazy Queue模式且无法更改
Lazy Queue正常情况下写的效率比普通数据持久化并发效率更高(只写磁盘了都)
消费者的可靠性
建议使用重试机制,会联合确认机制做到性能最高
消费者确认机制
消费者和队列之间的沟通
消费者可能返回三种类型消息
1.ack:处理成功之后返回
2.nack:处理失败且想要Queue再次投递消息时候返回
3.reject:处理失败其不需要Queue再次投递消息(应用场景:比如处理过程中,消息内容本身有误的这种情况,json转换时候失败)
建议配置成AUTO
消息处理异常比如说MessageConversionException这种异常
就会返回reject给队列
消费者失败重试
上一种情况,可能消费者一直不能从故障中恢复,mq和我们程序之间会来回甩锅,浪费性能
而这个就是在消费者本地去重试,不去请求MQ了
类似于生产者充实,不过这个是配置在消费者端的
那到达最大重试次数之后会怎么样呢?
会有不同的处理策略
默认为第一种,三次后直接丢弃(不建议选择)
第二种的话相当于耗尽后返回nack,消息会重新入队
第三种相当于你定义了一个处理失败消息的路由和队列
第二种你搜一下怎么配置,下面展示第三种怎么配置
第三种配置方式
error为rountingkey
业务幂等性
业务幂等性就是保证一个消息一次处理和多次处理的结果一致
比如说你在消费者准备给MQ发送ack过程中发生了网络故障
这样的话,ack发送不成功,网络恢复后,MQ认为没有处理完,会再次发送该消息,造成多次消费的情况
如果这个消息处理的业务是要扣减库存,就会造成重复扣减,不符合正常业务逻辑
有些消息本来就是有幂等性的,做幂等性处理,而有些消息就需要做幂等性处理,防止业务逻辑的不正确处理
我们以消息多次投递导致业务被重复执行场景为例,思考解决方案
发送方需要配置好消息转换器,这样的话,相同消息会有相同的id
唯一消息id
这个就是发送后生成的id
那么接收方怎么获取这个id呢?
之前是发什么,用什么类型接收
现在用Message接收,就可以获取对应的MessageId()
而Message的body就是我们的传送的信息
唯一消息id:性能较低,且有业务侵入,不太推荐,如果实在没办法可以去使用这种方式
业务判断
该方法,通过业务中本来存在的字段去判断,防止重复执行,有些业务适合,而有些不适合,如果不适合的话只能用第一种方式区处理
比如说该场景
如果说一个用户先支付,mq发消息,但是没接受到ack
然后用户退款不想买了,此时正好,mq要重发消息,又把我们的退款状态改为了支付完成状态
这样就不是幂等的了
我们可以通过先查询订单状态,然后再进行更改实现业务逻辑的幂等性
只有订单为未支付的状态才看可以更改,其他状态都不行
说实话这一小节需要结合具体业务来判断
视频
延迟消息
这个是上面方案之后的兜底的一个方案
正常情况下,我们的支付服务可以获得支付信息,然后将信息通过mq传给交易服务和商品服务
但是如果支付服务就是没办法将消息投递给交易服务,那样交易服务也获取不了支付状态,获取不了支付状态,会影响原本业务逻辑
假设支付了,但是交易服务状态还是未支付,不一致,假设没支付,但商品服务扣减了库存
我们需要设置一个超时取消的效果恢复我们的商品服务和交易服务,以防止MQ的消息没法正常到达交易服务
交易服务等待一段时间,过了这个时间后还没有收到mq消息,我们主动去查询支付服务状态(远程调用)
如果查询到没支付,就执行没支付的逻辑,已支付就执行已支付的状态
这种就需要使用延迟消息达到一个延迟任务的效果
下面有两种实现方案
死信交换机
不写了,自己了解一下,属于上一代的视线延时消息的方式
延迟消息插件
下载插件
原理就是就是生产者设置时间,将交换机的delay属性设置为true,交换机接收到消息后会在指定时间后转发给队列实现延迟消息的效果
插件名称
Dealayed Messaging for RabbitMQ
下载插件和对应MQ版本要一致
建议搜一下windows启动该插件的命令,也有linux用docker部署启动命令,这里我只演示怎么使用
首先设置一个支持delayed延迟消息的交换机
两种方式bean或者注解都可以
在发送消息的时候多指定一个参数MessagePostProcessor
拿到消息本体去设置Delay对应过期时间,单位是毫秒
然后启动项目运行测试案例就可以看到效果了
视频的后半段演示延迟效果
相关文章:
RabbitMQ从入门到实战-3(高可靠性)
文章目录 发送者可靠性发送者重连发送者确认(一般不会开启)指定returncallback和confrimfallbacktips MQ可靠性数据持久化LazyQueue(默认模式且不可更改) 消费者的可靠性消费者确认机制消费者失败重试业务幂等性唯一消息id业务判断…...
RTK 实时动态定位概述
01 引言 RTK(实时动态定位,Real-Time Kinematic)是一种高精度的卫星导航定位技术,通过差分校正方法,将GNSS(全球导航卫星系统)的定位精度从米级提升至厘米级(通常1-3厘米),广泛应用于测绘、无人机、自动驾驶、精准农业等领域。 02 概述 1. RTK的基本原理 RTK的核…...
Conda 环境离线迁移实战:解决生产环境网络限制的高效方案20250409
Conda 环境离线迁移实战:解决生产环境网络限制的高效方案 在生产环境无法联网的前提下,如何高效、安全地部署 Python 虚拟环境,是许多企业在实际运维中必须面对的问题。特别是当前常见的开发环境基于 Miniconda,生产环境使用 Ana…...
dify使用知识库
注意 要用向量模型 导入文件 选择向量模型 要下载好后,才可以导入模型, 这个模型没法在ollama中run 聊天工具添加知识库 效果...
HTTP:一.概述
http是干嘛的? 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统…...
Appium工作原理及环境的搭建(1)
1、Appium的介绍: 一、什么是Appium Desktop? Appium Desktop是Appium项目的桌面版GUI工具,提供了一个友好的界面,用于启动Appium服务器、查看设备日志、与设备交互、调试自动化脚本等。相比于命令行工具,Appium Des…...
Interactron: Embodied Adaptive Object Detection(训练时进行更新参数) 还没看懂
Interactron: Embodied Adaptive Object Detection 创新点 这些方法通常存在两个主要的共同假设。第一,模型在固定的训练集上进行训练,并在预先录制的测试集上进行评估。第二,模型在训练阶段结束后保持冻结状态,即训练完成后不再…...
【Pandas】pandas DataFrame copy
Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...
Redis基础指令(Windows)
1.cmd命令行启动redis 直接cmd打开整个文件 1.1.启动server 输入指令: redis-server.exe redis.windows.conf 会进入serve端 1.2.启动客户端 !!重新打开一个cmd,方法和上面一样!! 之后输入 redis-…...
MV-DLS600P激光振镜立体相机(MV-DLS600P)重要参数解析
功能特性 采用激光振镜技术,亚毫米级图像采集精度 高能效激光模块配合精准曝光同步,性能更稳定 支持多帧融合,无惧金属工件表面反光干扰 支持RGB、深度图同步对齐输出,便于二次开发 配备窄带滤光片,抗干扰能力更强&…...
C语言【输出字符串中的大写字母】
题目 输出字符串中的大写字母 思路(注意事项) 纯代码 #include<stdio.h> #include<string.h>int main(){char str[20], ans[20];fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0, j 0; i < strl…...
UniApp基于xe-upload实现文件上传组件
xe-upload地址:文件选择、文件上传组件(图片,视频,文件等) - DCloud 插件市场 致敬开发者!!! 感觉好用的话,给xe-upload的作者一个好评 背景:开发中经常会有…...
deque容器
1.定义 也叫双端数组,可以对头部进行插入和删除。 2.与vector区别 3.内部工作原理 他是把整个地址划分成多块小地址(缓冲区),然后有一个中控区去记录这些地址,然后访问的时候先通过中控区然后再转到相应的缓冲区&am…...
git 总结遇到的问题
git Push 报错 Push failed send-pack: unexpected disconnect while reading sideband packet Total 2269 (delta 418), reused 0 (delta 0), pack-reused 0 the remote end hung up unexpectedly 解决方案:增加 Git 的缓冲区,有时由于数据量大或网络…...
python基础语法11-文件读写
在 Python 中,文件操作是日常编程中的常见任务之一。Python 提供了简单且强大的工具来读取和写入文件。通过使用内置的 open() 函数、read()、readline()、write() 等方法,我们可以轻松实现对文件的操作。此外,Python 的 with 语句可以帮助我…...
Webstorm 使用搜不到node_modules下的JS内容 TS项目按Ctrl无法跳转到函数实现
将node_modules标记为不排除,此时要把内存改大,不然webstorm中途建立索引时,会因为内存不足,导致索引中途停止,造成后续搜索不出来 更改使用内存设置 内存调为4096 若出现搜不出来js内容时,请直接重启下该项…...
转行嵌入式,需要自学多久?
作为一个本硕都学机械,却阴差阳错进入嵌入式行业的老兵,这个问题我能聊一整天。十几年前我还在工厂车间穿着工装和机床打交道,偶然接触到单片机后就一发不可收拾。 转行这条路我走得异常艰辛,踩过的坑比写过的代码还多。去年我终…...
BLE 协议栈事件驱动机制详解
在 BlueNRG-LP 等 BLE 系统中,事件驱动是控制状态转移、数据交互和外设协作的基础。本文将深入讲解 BLE 协议栈中事件的来源、分发流程、处理结构与实际工程实践策略,帮助你构建稳定、可维护的 BLE 系统。 📦 一、BLE 事件的来源分类 BLE 协议栈中的事件严格来自协议栈本身…...
AI开发学习路线(闯关升级版)
以下是一份轻松版AI开发学习路线,用「闯关升级」的方式帮你从零开始变身AI开发者,每个阶段都配有有趣的任务和实用资源,保证不枯燥、可落地!👇 目录 🔰 新手村:打基础(1-2个月&…...
突破,未观测地区罕见极端降雨的估计
文章中文总结(重点为方法细节) 一、研究背景与目的 在无测站或短观测记录地区,传统极值理论(如GEV)难以估计稀有极端降雨事件;本文提出一种新的区域化极值估计方法:区域化 Metastatistical Ex…...
zk源码—4.会话的实现原理一
大纲 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建 (3)会话ID的初始化实现 (4)设置的会话超时时间没生效的原因 2.分桶策略和会话管理 (1)分桶策略和过期队列 (2)会话激活 (3)会话超时检查 (4)会话清理 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建…...
快排算法 (分治实现)
本算法采用将整个数组划分成三个部分 <key key >key 在数组全是同一个数字时,也能达到NlogN的时间复杂度 下面的板书中i为遍历数组的下标 left为<key的最右边的下标 right为>key的最左边的下标 例题1:912. 排序数组 - 力扣࿰…...
P9242 [蓝桥杯 2023 省 B] 接龙数列
这道题说要求最少删多少个使剩下的序列是接龙序列,这个问题可以转换为序列中最长的接龙序列是多少,然后用总长度减去最长接龙序列的长度就可以了,在第一个暴力版本的代码中我用了两个for循环求出了所有的接龙序列的长度,但是会超时…...
未来 AI 发展趋势与挑战(AGI、数据安全、监管政策)
从 ChatGPT 的火爆到国内 DeepSeek、通义千问、百川智能等模型的兴起,AI 正以前所未有的速度走入各行各业。而下一阶段,AI 是否会发展出真正的“通用智能”(AGI)?数据隐私、技术伦理又该如何应对?本文将带你全面洞察未来 AI 的技术趋势与落地挑战。 一、AGI 的曙光:通用…...
驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比
🔍 B站相应的视屏教程: 📌 内核:博文视频 - 从静态绑定驱动模型到现代设备模型 主题:深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中,我们从驱动框架的历史演进出…...
MyBatis 动态 SQL 使用详解
🌟 一、什么是动态 SQL? 动态 SQL 是指根据传入参数,动态拼接生成 SQL 语句,不需要写多个 SQL 方法。MyBatis 提供了 <if>、<choose>、<foreach>、<where> 等标签来实现这类操作 ✅ 二、动态 SQL 的优点…...
数据结构实验4.1:链队列的基本操作
文章目录 一,问题描述二,基本要求三,算法分析链队列的存储结构设计基本操作的算法分析 四,示例代码五,实验操作六,运行效果 一,问题描述 编程实现有关链队列的下列基本操作。 (1&am…...
独立部署及使用Ceph RBD块存储
Ceph RBD(RADOS Block Device) 是 Ceph 分布式存储系统中的块存储组件,类似于 AWS EBS、iSCSI 等。它独立于 OpenShift 或 IBM CP4BA,是一个分布式存储系统,提供高性能、可扩展性和容错能力,适用于数据库、…...
C++初阶-C++入门基础
目录 编辑 1.C的简介 1.1C的产生和发展 1.2C的参考文档 1.3C优势和难度 1.4C学习的建议 2.C的第一个程序 2.1打印Hello world 2.2头文件 2.3namespace命名空间 2.4::作用域限定符 2.5namespace的延伸 2.6C的输入输出 3.总结 1.C的简介 …...
部署大模型不再难:DeepSeek + 腾讯云 HAI 实战教程
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
算法训练之位运算
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
初识Linux:常见指令与权限的理解,以及相关衍生知识
目录 前言 关于linux的简介 代码开源 网络功能强大 系统工具链完整 一、Linux下的基本指令 1.ls指令 2.pwd指令 3.cd指令 4.whoami指令 5.touch指令 6.mkdir指令 7.rm指令 8.man指令 9.cp指令 10.mv指令 11.nano指令 12.cat指令 13.tac指令 14.more指令 15.less指令 16.head指令…...
PostgreSQL-数据库的索引 pg_operator_oid_index 损坏
报错信息: 连接测试失败 Error connecting to database: Connection failed: ERROR: index "pg_operator_oid_index" contains unexpected zero page at block 3 Hint: Please REINDEX it. 这个错误表明 PostgreSQL 数据库的索引 pg_operator_oid_index …...
数字图像处理作业4
数字图像处理 作业4 Project 4:Image Restoration The scoring method for this project is as follows: 1.Implement a blurring filter using the equation(5.6-11,数字图像处理(…...
Simulink中Signal Builder在新版中找不到怎么办
在较新的MATLAB版本中,新版Simulink中的Signal Builder用Signal Editor作为替代工具。 signal builder not shown in matlab - MATLAB Answers - MATLAB Central signalBuilderToSignalEditor 1.打开上面第二个链接 2.点击拷贝 3.然后在命令行中粘贴 4.然后就会…...
STM32——RTC实时时钟
RTC简介 RTC(Real Time Clock, RTC)实时时钟,其本质是一个计数器,计数频率常为秒,专门用来记录时间。 其具有能提供时间(秒钟数),能在MCU掉电后运行,低功耗的特性 内部框图 1. RTC预分频器 2. …...
sqli-labs靶场 less4
文章目录 sqli-labs靶场less 4 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
指针数组 vs 数组指针
一、指针数组:「数组装指针」—— 每个元素都是指针 🔍 核心定义 语法:类型* 数组名[长度]; ([]优先级高于*,先形成数组,元素是指针)本质:一个 数组,数组的每个元素是 …...
GitHub优秀项目:数据湖的管理系统LakeFS
lakeFS 是一个开源工具,它将用户的对象存储转换为类似Git的存储库。使用户可以像管理代码一样管理数据湖。借助 lakeFS,可以构建可重复、原子化和版本化的数据湖操作--从复杂的ETL作业到数据科学和分析。 Stars 数11090Forks 数3157 主要特点 强大的数据…...
数据库视图讲解(view)
一、为什么需要视图 二、视图的讲解 三、总结 一、为什么需要视图 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。 比如,针对一个公司的销售人员,我们只想给他看部分数据,…...
pip install pytrec_eval失败的解决方案
1、问题描述 在使用华为云 notebook 的时候,想要: !pip install transformer结果失败,阅读报错后,疑似是 pytrec_eval 库的下载问题。 于是,单独尝试: !pip install pytrec_eval发现确实是这个库安装失…...
使用stream的Collectors.toMap()方法常见问题
文章目录 一、常见问题二、key重复问题2.1、报错示例2.2、解决方法 三、value为空问题3.1、报错示例3.2、解决方法3.1、方案一3.2、方案二 一、常见问题 stream的Collectors.toMap()方法常见问题: 1、 key不能有重复,否则会报错。java.lang.IllegalStat…...
[C++面试] 初始化相关面试点深究
一、入门 1、C中基础类型的初始化方式有哪些?请举例说明 默认初始化 对于全局变量和静态变量,基础类型(如int、float、double等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机…...
ChatDBA:一个基于AI的智能数据库助手
今天给大家介绍一个基于 AI 大语言模型实现数据库故障诊断的智能助手:ChatDBA。 ChatDBA 是由上海爱可生信息技术股份有限公司开发,通过对话交互,提供数据库故障诊断、专业知识学习、SQL 生成和优化等功能,旨在提升 DBA 工作效率。…...
Java延迟队列
📌 1. 场景背景 最近做项目,使用到了延迟队列。场景是这样的:在在线视频学习中,学生每隔几秒上报当前学习进度,为避免频繁写数据库、提升性能,采用以下方案: 先写入 Redis,再延迟一…...
神舟平板电脑怎么样?平板电脑能当电脑用吗?
在如今的数码产品市场上,神舟平板电脑会拥有独特的优势,其中比较受到大家关注的就是神舟PCpad为例,无论是设计还是规格也会有很多的亮点,那么是不是可以直接当成电脑一起来使用呢? 这款平板电脑就会配备10.1英寸显示屏…...
Ansible的使用3
#### 一、Ansible补充模块 try () { } catch () { } finally 等同于 block () { } rescue () { } always ##### 任务块 - block任务块 - 通过block关键字,将多个任务组合到一起 - 将整个block任务组,一…...
PS教学记录
PS制作手机壁纸和电脑壁纸 1. 思绪来源 找到了一位B站UP,分享了有关于灰原哀的动态壁纸。自身( •̀ ω •́ )也是名侦探柯南的爱好者,在此基础上,萌生了制作壁纸的想法。便在B站上搜寻有关于壁纸制作的教学。找到了一位壁纸分享者的教程镜…...
分析一下HashMap内部是怎么实现的
当然可以!我们来深入分析一下 Java 中 HashMap 的内部实现机制(以 JDK 8 为主),包括数据结构、核心算法、源码设计、以及适用场景。 🧠 一、HashMap 的核心结构 HashMap 是基于哈希表实现的 Map,底层结构是…...
面向对象的要素
理解面向对象 程序的三种基本结构 (1)顺序结构 (2)选择结构 (3)循环结构 面向对象程序设计简介 面向对象是一种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、封装、消息等基本…...