【学习笔记】RabbitMQ-6 消息的可靠性投递2
参考资料
- RabbitMQ官方网站
- RabbitMQ官方文档
- 噼咔噼咔-动力节点教程
文章目录
- 十一、队列Queue的消息属性
- 11.1 具体属性
- 11.2 自动删除
- 11.2 自定义参数
- 11.2.1 **Message TTL** 消息存活时间
- 11.2.2 **Auto expire** 队列自动到期时间
- 11.2.3 **Overflow behaviour** 溢出行为
- 11.2.4 **Single active consumer**单一消费者模式
- 11.2.5 **Dead letter exchange**死信交换机和 **Dead letter routing key**死信路由key
- 11.2.6 Max length队列最大信息数 和Max length bytes 队列磁盘大小
- 11.2.7 **Maximum priority**最高优先级
- 11.2.8 Lazy mode懒模式
- 11.2.9 **Master locator**主定位器
- 十二、消息的可靠性投递
- 12.1 概念理解
- 12.2 如何提高消息的可靠性
- 12.2.1 消息发送时的确认模式
- 12.2.2 消息返回模式
- 1.2.2.3 持久化机制
- 12.2.4 消费时的确认模式
- 12.2.5 集群、镜像队列,保证高可用
- 十三、消息的幂等性
- 13.1 概念
- 13.1.1 幂等性
- 13.1 举例:接口幂等性
- 13.2 数据库的幂等性
- 13.2 如何避免消息的重复消费问题?(消息消费时的幂等性
- 13.1 全局唯一id +Redis
- 13.3 :star:代码实现
- 13.3.1 环境准备
- 13.3.2 实例思路整理
十一、队列Queue的消息属性
11.1 具体属性

- Type:类型,只需要关注classic
- Name:名称
- Durability:持久化
- Auto Delete:是否自动删除
- Arguments:参数
11.2 自动删除
- 当最后一个消费者断开连接后,队列将会删除
- 一般不会用,存在数据丢失的风险
11.2 自定义参数
11.2.1 Message TTL 消息存活时间
- 官方解释
- 定义了一个消息再被推送后,再被丢弃之前,可以存活的时间
- 单位:毫秒
- 参数格式 :“x-message-ttl” : number
- 如果消息在指定的时间段内未被消费,则该消息将被标记为过期并被丢弃。
- 这可以确保不再需要的消息不会一直存在于队列中,从而占据资源。
11.2.2 Auto expire 队列自动到期时间
-
官方解释x-expires
-
在自动删除队列之前,队列可以闲置多长时间(How long a queue can be unused for before it is automatically deleted)
-
定义了队列自动过期的时间。
-
参数格式 “x-expires”:number
-
如果队列在指定的时间段内未被使用,则该队列将被自动删除。
-
这可以确保不再需要的队列不会一直存在于RabbitMQ服务器上,从而占据资源。
11.2.3 Overflow behaviour 溢出行为
- 官方解释 queue overflow behaviour
- overflow behavior参数用于定义当队列达到最大容量时的处理方式。
- 参数格式:“x-overflow”:string
- 在RabbitMQ中,有以下几种可选的overflow behavior:
- drop-head: 当队列达到最大容量时,新的消息将被丢弃,并且最早进入队列的消息会被删除,以腾出空间给新的消息。
- reject-publish: 当队列达到最大容量时,新的消息将被拒绝发送,并且发布者将收到一个拒绝通知。这种方式可以让发布者有机会处理无法发送的消息。
- reject-publish-dlx: 当队列达到最大容量时,新的消息将被拒绝发送,并且发布者将收到一个拒绝通知。同时,被拒绝的消息会被发送到一个死信交换器(Dead-Letter Exchange),以便后续进行处理。
- reject-subscribe: 当队列达到最大容量时,新的订阅者将无法成功订阅该队列,并且会收到一个拒绝通知。这种方式可以让订阅者有机会处理无法接收的消息。
11.2.4 Single active consumer单一消费者模式
- Single active consumer(单一活动消费者)是一种消息队列的消费模式。
- 在这种模式下,一个队列只能有一个活动的消费者来处理消息,而其他消费者处于非活动状态。
- 参数格式“x-single-active-consumer”:bool
- 使用Single active consumer模式可以确保消息的顺序性和可靠性。
- 当只有一个消费者活动时,消息将按照顺序被处理,避免了多个消费者并发处理消息可能引起的顺序混乱问题。
- 此外,由于只有一个消费者在处理消息,可以减少并发操作带来的资源竞争和冲突。
- Single active consumer模式也存在一些限制。
- 于只有一个消费者在处理消息,如果该消费者出现故障或变得不可用,整个消息队列将无法被处理。
- 因此,在设计系统时需要考虑到这种单点故障的风险,并采取相应的容错和监控机制来保证系统的可用性。
11.2.5 Dead letter exchange死信交换机和 Dead letter routing key死信路由key
两者配合可以指定DLX发送的交换机和键,之前已经研究过就不做赘述了
11.2.6 Max length队列最大信息数 和Max length bytes 队列磁盘大小
-
Max length参数用于限制队列中消息的最大数量。当队列中的消息数达到最大值时,新的消息将被拒绝并返回给发布者。
-
Max length bytes参数用于限制队列中消息的最大总大小(磁盘空间。当队列中所有消息的大小总和达到最大值时,新的消息将被拒绝并返回给发布者。
这两个参数可以用于控制队列的大小,以避免队列过度增长导致系统资源耗尽。在设置这些参数时,需要根据具体的业务需求和系统资源情况进行权衡和调整。
-
注意,Max length bytes的单位是byte。比如要设置1G的最大磁盘空间
'x-max-length-bytes': 1073741824
11.2.7 Maximum priority最高优先级
- 当消息被发布到队列时,可以为消息设置一个优先级,优先级越高的消息将会被先处理。
- 使用Maximum priority参数可以限制队列中消息的最大优先级,超过该优先级的消息将被丢弃或者被发送到死信交换器(Dead-Letter Exchange)。
11.2.8 Lazy mode懒模式
-
用于延迟队列的内存分配,从而减少内存的使用量。
-
在Lazy mode下,队列的消息不会立即被写入磁盘,而是先被存储在内存中,直到内存达到一定的阈值时才会被写入磁盘。
默认情况下,消息会一直存在内存中,占用过多内存可能会导致运行过慢、消息丢失、系统崩溃等问题
-
使用Lazy mode可以在一定程度上降低队列的内存使用量,提高系统的性能和可扩展性。
-
然而,由于消息需要等待一定时间才能被写入磁盘,因此在使用Lazy mode时需要注意消息的持久化和数据丢失的风险。如果需要确保消息不会丢失,需要将消息设置为持久化,并且在队列中启用持久化模式。
-
参数配置格式
“x-queue-mode” : “lazy”
11.2.9 Master locator主定位器
用于集群,暂不涉及
RabbitMQ的Master locator用于在集群中查找当前拥有某个队列的主节点(Master Node)。在RabbitMQ集群中,一个队列可以被复制到多个节点上,其中一个节点被指定为主节点,其他节点为从节点。主节点负责处理所有的读写请求,而从节点只负责复制主节点上的数据。
十二、消息的可靠性投递
12.1 概念理解
消息的可靠性投递是指在消息传递过程中,确保消息能够被成功地传递到目标节点并被消费者正确地处理。
在消息传递中,可能会发生网络故障、节点宕机等问题,这些问题可能会导致消息丢失或重复传递,从而影响系统的可靠性和稳定性。
12.2 如何提高消息的可靠性
注意
消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功,那么这肯定会牺牲些性能,性能与可靠性是无法兼得的
如果业务实时一致性要求不是特别高的场景,可以牺牲一些可靠性来换取性能。
消息的传递模型如下

12.2.1 消息发送时的确认模式
对应第一步的生产者到交换机的这一步,确保消息成功发送到交换机
12.2.2 消息返回模式
对应的是交换机到队列这一步,确保消息成功从交换机发送到队列中
当然在实际生产环境下,我们不会出现这种问题,必须对所有的name和key进行严格测试才能上线(很少有这种问题 ) ;
1.2.2.3 持久化机制
交换机和队列的持久化机制,保证服务器故障或重启后,消息仍然存在
- 队列持久化
- 交换机持久化
- 消息持久化
12.2.4 消费时的确认模式
启动手动确认模式,前面有提到。
只有当消费者确保业务运行成功后,再确认接受消息。
12.2.5 集群、镜像队列,保证高可用
- 设置rabbitMQ的集群
- 设置镜像队列
十三、消息的幂等性
同一个消息,第一次接收,正常处理业务;
如果同一个消息,第二次接收,那就不能再处理了,否则就重复处理了。
13.1 概念
13.1.1 幂等性
概念:对一个资源,无论请求一次还是多次,该数据本身造成的影响应该是相同的,不能因为重复的请求而造成资源重复造成影响。
(个人理解:有点类似数据库的一致性
13.1 举例:接口幂等性
接口幂等性是指:一个接口用同样的参数反复调用,不会造成业务错误,那么这个接口就是具有幂等性的;
这些接口必须要要做幂等设计:
- 注册接口:多次请求注册,也只能生成同一个新账号
- 发送短信验证码接口:多次请求也只发送一次短信
- 比如同一个订单我支付两次,但是只会扣款一次,第二次支付不会扣款,这说明这个支付接口是具有幂等性的;
13.2 数据库的幂等性
问:sql语句中哪些语句是非幂等的?
- select:多次查询结果一样:幂等
- delete:多次删除结果也是一样:幂等
- update:不进行计算的更新操作:幂等
- insert:除非指定id,多次的插入会导致多条数据,所以是非幂等的。
所以需要对insert的进行幂等操作,比如数据库自带的约束。或者在插入前进行查询,避免重复插入。
13.2 如何避免消息的重复消费问题?(消息消费时的幂等性
13.1 全局唯一id +Redis
当生产者发送消息时,设置一个全局唯一的messageId,消费者拿到消息后,使用redis的setnx指令存储messageId,如果存储成功(返回为1)说明消息还为被处理,如果返回为0,则说明已经被处理过了。
关于SETNX
SETNX 指令常用于实现分布式锁的场景,通过尝试设置一个特定的键来获取锁,如果设置成功则表示获取到了锁,否则表示锁已经被其他客户端持有。
SETNX key value当执行 SETNX 指令时,会按照以下步骤进行处理:
- 如果键 key 不存在,则设置键 key 的值为 value。
- 如果键 key 已经存在,则不进行任何操作,返回 0。
- 如果设置成功,则返回 1。
13.3 ⭐️代码实现
13.3.1 环境准备
-
redis
-
项目依赖新增:
spring-boot-starter-redis
13.3.2 实例思路整理
生产者:
- 模拟一个订单对象,其中一个属性为订单id(唯一)
- 发送两个订单,他们的订单id相同(模拟非幂等情况
消费者:
- 开启手动确认模式:
spring.rabbitmq.listener.simple.acknowledge-mode = manual - 正常监听队列,接收到订单信息后,将订单id存入redis
- 判断redis的存储结果,如果正常存入redis,则确认接受信息并继续进行消费者业务。否则拒绝信息。
代码略
相关文章:
【学习笔记】RabbitMQ-6 消息的可靠性投递2
参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 十一、队列Queue的消息属性11.1 具体属性11.2 自动删除11.2 自定义参数11.2.1 **Message TTL** 消息存活时间11.2.2 **Auto expire** 队列自动到期时间11.2.3 **Overflow behaviour** 溢出行为11.2.4…...
黑豹程序员-知识点-写一个bat一次执行多条命令
start cmd 执行命令行窗口 /c 执行完命令就关闭,/k执行完命令不关闭 执行多条命令,命令直接使用&&连接 echo onstart cmd /k "pnpm create vite vhello --template vue && cd vhello && pnpm install && pnpm run…...
从头开始机器学习:线性回归
一、说明 本篇实现线性回归的先决知识是:基本线性代数,微积分(偏导数)、梯度和、Python (NumPy);从线性方程入手。 代码/注释存储库链接 拉曼欣德 GitHub - ramanthind02/Machine_learning_from…...
1-k8s1.23.6-底座搭建-基于docker
这里写自定义目录标题 一、服务器准备二、安装docker三、安装k8s四、安装部署dashboard 一、服务器准备 服务器准备 服务器名称服务器IP角色CPU(最低要求)内存(最低要求)master192.168.248.10master2核2Gworker1192.168.248.11node2核2Gworker2192.168.248.12node2核2G 修改ip&…...
【SA8295P 源码分析 (一)】76 - Thermal 功耗 之 /dev/thermalmgr 相关调试命令汇总
【SA8295P 源码分析】76 - Thermal 功耗 之 /dev/thermalmgr 相关调试命令汇总 1、配置文件:/mnt/etc/system/config/thermal-engine.conf2、获取当前SOC所有温度传感器的温度:cat /dev/thermalmgr3、查看所有 Thermal 默认配置和自定义配置:echo query config > /dev/th…...
每日汇评:随着上升趋势的恢复,黄金在1950美元上方等待破位
周三早间,黄金价格逼近1950美元,买家纷纷出手; 尽管市场情绪谨慎,但美元与美债交投疲弱,中国的乐观情绪逐渐消退; 金价重拾200日移动均线,但料持续升穿1950美元; 金价正从每盎司1943…...
postgresql字符串处理的函数
1. SPLIT_PART SPLIT_PART() 函数通过指定分隔符分割字符串,并返回第N个子串。语法: SPLIT_PART(string, delimiter, position) string : 待分割的字符串 delimiter:指定分割字符串 position:返回第几个字串,从1开始&…...
(1)攻防世界web-Training-WWW-Robots
1.开启环境,查看网页 翻译一下 2.前往robots.txt 命令:http://61.147.171.105:57663/robots.txt 3.前往fl0g.php 命令:http://61.147.171.105:57663/fl0g.php 4.得到flag cyberpeace{92ec1ef9b6d900100399093b9ae9e386}...
list.set交换数据需要(or不需要)添加其他中间变量,两个例子告诉你
说明:set()方法是来修改指定位置的元素。 两个参数,第一个参数是要修改的元素的索引,第二个参数是要设置的新值。 案例一:当链表中传入的是字符串时: public static void main(String[] args) {List list new Linke…...
Linux中的主要系统调用
Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(C…...
在vscode中配置git bash终端、git 源码管理
打开vscode文件->首选项->设置,打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意: terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…...
(三十四)大数据实战——scala运行环境安装配置及IDEA开发工具集成
前言 本节内容我们主要介绍一下scala运行环境的安装配置以及在idea开发工具中集成scala插件,便于scala项目的开发。 在开始scala安装配置之前,我们要先安装好jvm运行环境,scala运行于Java虚拟机(JVM)上,并…...
Double 4 VR智能互动教学系统的教学应用
1. 激发学习兴趣 Double 4 VR智能互动教学系统通过虚拟现实技术为学生创造了一个身临其境的学习环境。学生可以通过戴上VR头盔,进入虚拟世界中与教学内容互动。这种沉浸式的学习方式能够激发学生的学习兴趣,使他们更加主动地参与到课堂中来。 2. 提供直…...
GPU 驱动下载记录
1. 我的GPU 是这个:GeForce RTX 2060 下载链接是:Official Drivers | NVIDIA...
KILM: Knowledge Injection into Encoder-Decoder Language Models
本文是LLM系列文章,针对《KILM: Knowledge Injection into Encoder-Decoder Language Models》的翻译。 KILM:知识注入到编码器-解码器语言模型 摘要1 引言2 相关工作3 方法4 实验5 讨论6 结论局限性 摘要 大型预训练语言模型(PLMs)已被证明在其参数内保…...
205、使用消息队列实现 RPC(远程过程调用)模型的 服务器端 和 客户端
目录 ★ RPC模型(远程过程调用通信模型)▲ 完整过程:代码演示总体流程解释:ConstantUtil 常量工具类ConnectionUtil RabbitMQ连接工具类Server 服务端Client 客户端测试结果服务端客户端 完整代码ConstantUtil 常量工具类Connecti…...
C++中的函数
在C中,函数是程序的一部分,它执行特定的任务。函数的基本语法如下: type function-name( parameter list ) { body of the function } type 是函数的返回类型,function-name 是函数的名称, parameter list 是传递…...
java操作时间的方式
java操作时间的方式 获取年月日时分秒 public class Test { public static void main(String[] args) { System.out.println("----------使用Calendar--------------------"); Calendar cal Calendar.getInstance(); System.out.println(&q…...
上网冲浪发现多处XSS
突然的发现 今天上网冲浪,突然想起来有一种神器,叫废话生成器,之前是在哪里下了个软件玩了一下,然后就给删除了,因为我觉得这个软件不过就是调用了一个web接口实现的,一个网页能解决的事还要我下一个软件。…...
机器学习的打分方程汇总
机器学习的打分方程集合 受到机器学习(Machine Learning)和深度学习(Deep Learning)等算法模型的创新性冲击,其应用范围涵盖了自然语言处理(Natural Language Processing)、自动驾驶(…...
终极指南:如何使用Python实现同花顺自动化程序交易
终极指南:如何使用Python实现同花顺自动化程序交易 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化投资领域,自动化交易已成为专业投资者的标准配置。本文将详细介绍如何利用jqk…...
新能源车BMS低压管理避坑指南:如何解决上下电时序中的典型问题
新能源车BMS低压管理避坑指南:如何解决上下电时序中的典型问题 在新能源汽车的电池管理系统(BMS)开发中,低压上下电时序控制是确保系统稳定运行的关键环节。许多开发团队在实际项目中都会遇到信号冲突、时序错乱、异常处理机制不完…...
[C语言]控制台扫雷游戏
用精简的代码,回顾数组、函数和游戏逻辑的核心应用。还记得Windows自带的扫雷吗?这次我们用C语言实现一个9x9的简易版,适合用来巩固函数封装、二维数组和随机数等知识点。1. 整体思路 扫雷的核心功能可以拆成几块: 打印菜单&#…...
在QT中将多个项目(同代码不同ui和资源文件)合并
Linux下的qt环境 我现在有三个项目,代码一模一样,只有UI文件和资源文件不同现在想要合并代码 后期好上传在git 仅需要一个分支 更好管理将随行 康养 采图三个项目代码合并 思路是这样的 将每个项目都分类打包区分开我是在康养这个项目的基础上合…...
Jmeter接口测试项目实战
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、什么是jmeter?JMeter是100%完全由Java语言编写的,免费的开源软件,是非常优秀的性能测试和接口测试工具,支持主流…...
Qwen3-TTS WebUI使用技巧:长文本自动分段+情感一致性保持方法
Qwen3-TTS WebUI使用技巧:长文本自动分段情感一致性保持方法 Qwen3-TTS-12Hz-1.7B-CustomVoice 是一款强大的语音合成模型,支持10种主要语言和多种方言语音风格,具备出色的上下文理解能力和情感表达能力。但在处理长文本时,如何保…...
保姆级教程:用Python+OpenCV搞定汽车360全景拼接(附C++移植思路)
从零构建汽车360全景系统:PythonOpenCV实战与C工程化指南 当你第一次坐上驾驶座,启动车辆时,中控屏上突然展现出车辆周围无死角的鸟瞰视图——这就是现代汽车360全景系统带来的神奇体验。作为提升驾驶安全性和便利性的关键技术,它…...
Rocky Linux 9.4 Minimal安装后必做的10件事:安全加固、性能优化与开发环境搭建
Rocky Linux 9.4 Minimal安装后必做的10件事:安全加固、性能优化与开发环境搭建 当你完成Rocky Linux 9.4 Minimal的安装,面对那个极简的命令行界面时,可能会感到一丝茫然。这个"裸"系统虽然轻量,但距离生产环境或高效开…...
像素史诗惊艳效果展示:10份高质量研报生成过程与成品对比
像素史诗惊艳效果展示:10份高质量研报生成过程与成品对比 1. 像素史诗:当AI研究遇上像素艺术 在数字内容创作领域,一款名为像素史诗(Pixel Epic)的工具正在重新定义研究报告的生成方式。这款基于AgentCPM-Report大模型构建的智能终端&#…...
炉石传说HsMod插件:55+功能全面优化你的游戏体验
炉石传说HsMod插件:55功能全面优化你的游戏体验 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx框架的开源炉石传说模改插件,为玩家提供超过55项实…...
