【学习笔记】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 具体属性

image-20231018103644603

  1. Type:类型,只需要关注classic
  2. Name:名称
  3. Durability:持久化
  4. Auto Delete:是否自动删除
  5. 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 指令时,会按照以下步骤进行处理:

  1. 如果键 key 不存在,则设置键 key 的值为 value。
  2. 如果键 key 已经存在,则不进行任何操作,返回 0。
  3. 如果设置成功,则返回 1。

13.3 ⭐️代码实现

13.3.1 环境准备
  • redis

  • 项目依赖新增:

    spring-boot-starter-redis
    
13.3.2 实例思路整理

生产者:

  1. 模拟一个订单对象,其中一个属性为订单id(唯一)
  2. 发送两个订单,他们的订单id相同(模拟非幂等情况

消费者:

  1. 开启手动确认模式:spring.rabbitmq.listener.simple.acknowledge-mode = manual
  2. 正常监听队列,接收到订单信息后,将订单id存入redis
  3. 判断redis的存储结果,如果正常存入redis,则确认接受信息并继续进行消费者业务。否则拒绝信息。

代码略

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信扫码跳转到小程序内部,浏览器扫码跳转到App 内部,如果手机上没有安装App ,跳转到下载页

第一:微信扫普通二维码跳转到小程序 第一步:登录微信公众平台,左侧点击开发管理,点击开发设置,滑到最下边,找到扫普通链接二维码打开小程序,配置对应的二维码链接,注意要拿这个链接去生成二维码,这样微信扫码才能跳转到小程序内部,还有那个校验文件,让后台放到对应的文件夹下,…

c#是不是比qt好找工作些?

c#是不是比qt好找工作些? C#和Qt都是非常流行的编程语言,会对你未来找工作都有一定的帮助。然而,就目前工作市场而言,C#的相关岗位可能更多一些,因为它被广泛用于企业应用开发和微软生态系统中。最近很多小伙伴找我,说…

python——loguru第三方日志管理模块

loguru第三方日志管理模块 loguru介绍日志等级日志保存日志过滤处理异常 loguru介绍 loguru是第三方库,拿来即用,不用太多的配置 安装:pip install loguru 日志等级 from loguru import loggerlogger.debug(这是一条调试消息!)…

SpringBoot面试题2:SpringBoot与SpringCloud 区别?SpringBoot和Spring、SpringMVC的区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot与SpringCloud 区别? Spring Boot 和 Spring Cloud 是 Spring 生态系统中的两个关键组件,它们有以下区别: 定位:Spring Boot 用于简…

C# OpenVINO Det 物体检测

效果 耗时 elephant:89% Preprocess: 0.00ms Infer: 47.21ms Postprocess: 11.63ms Total: 58.84ms 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using Sdcb.OpenVINO.Natives; using System; using System.Diagnostics; using System.Drawing; using System.Text; …

安科瑞Acrel-7000工业能耗在线监测系统,企业能源管控平台

安科瑞虞佳豪 能源管理系统采用分层分布式系统体系结构,对建筑的电力、燃气、水等各分类能耗数据进行采集、处理,并分析建筑能耗状况,实现建筑节能应用等。通过能源计划,能源监控,能源统计,能源消费分析&a…

“高级小程序开发指南“

目录 引言小程序视图层小程序逻辑层及生命周期总结 引言 随着移动互联网的快速发展,小程序作为一种轻量级的应用形态,在用户使用体验和开发者便捷性方面受到了广泛关注。本篇博客将带你深入探索小程序的视图层和逻辑层,并介绍其生命周期。 …

DTI综述(更新中)

Deep Learning for drug repurposing:methods,datasets,and applications 综述读完,觉得少了点东西,自己写个DTI综述 Databases(包括但不限于文章中的) DATABASEDESCRIBEBindingDB有详细的drug信息和对应的target&a…

需要影视解说配音的看过来,用它就对了

近年来,随着影视、动画等领域的快速发展,声音设计和配音成为了影片制作中不可或缺的一环。然而,并非每个人都拥有天赋般的配音技巧。面对这一困境,幸运的是,现在市面上有很多简单免费好用的配音软件,今天就…

基于B/S架构,包括PC后台管理端、APP移动端、可视化大屏端的智慧工地源码

智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程…

ant中的environment属性

在ant的配置文件中&#xff0c;可以设置属性environment的值&#xff0c;设置的这个值就作为访问环境变量的前缀。例如声明了environment“env”&#xff0c;那么就可以通过env.<环境变量名称>来访问环境变量。 例如创建了一个Java工程&#xff0c;在工程目录下有一个bu…

2023年震撼!Java地位摇摇欲坠?Java在TIOBE排行榜滑坡至历史最低!

一、Java掉到历史最低 从2023年6月开始Java掉到历史最低排到第4位 2023年10月tiobe编程语言排行榜&#xff0c;Java仍然还是排到了第4位&#xff0c;C# 和 Java 之间的差距从未如此之小。 top 10 编程语言1988年~2023年历史排名 引用tiobe官网上TIOBE Software 首席执行官的话…

[uni-app] canvas绘制圆环进度条

文章目录 需求参考链接基本问题的处理1:画布旋转的问题2:注意arc()的起始位置是3点钟方向3: 如果绘制1.9*Matn.PI的圆环, 要保证其实位置在0点方向?4:小线段怎么画, 角度怎么处理? 源码 需求 要绘制一个如此的进度条 参考链接 uni-app使用canvas绘制时间刻度以及不显示问…

【前端学习】—JS判断数据类型的方式有哪些(八)

【前端学习】—JS判断数据类型的方式有哪些&#xff08;八&#xff09; 一、JS中判断数据类型的场景 二、JS中有哪些数据类型 三、JS判断数据类型的方式有哪些 const arr[]; const object{};const number1; const stringstring;//typeofconst typetypeof arr; console.log(type…

【算法|前缀和系列No.5】leetcode1314. 矩阵区域和

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

使用流量管理工具保护 Kubernetes 的六种方法

原文作者&#xff1a;Jenn Gile - F5 NGINX 产品营销经理 原文链接&#xff1a;使用流量管理工具保护 Kubernetes 的六种方法 转载来源&#xff1a;NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 编者按 —— 本文是以下系列博文中的一篇&#xff08;共…

DeFi世界 MXT脱颖而出 利好不断

​​MixTrust希望成为用户在Web3世界的专用金融平台&#xff0c;注重为用户提供个性化的金融服务。而WorldCoin的愿景则是建设一个全球最大的、公平的数字身份和货币体系&#xff0c;强调构建一个涵盖全球范围的身份认证和货币交易系统。 扩展性 在扩展性方面&#xff0c;双方…

Windows11家庭版没有本地组策略编辑器解决

1. 新建一个文本文件将下面代码粘到里面&#xff0c;保存后修改后缀为.cmd或者.bat echo off pushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt dir /b C:\Windows\servicing\Packa…

pytorch_神经网络构建4

文章目录 循环神经网络LSTM词嵌入skip-Gram模型N-Gram模型词性预测RNN循环神经网络的基础模块实现RNN识别图片RNN时间序列预测词向量模块词向量运用N-Gram模型lstm词性预测 循环神经网络 这个网络主要用来处理序列信息,之前处理图片时大部分是分析图片的结构信息, 什么是序列信…

Kafka SASL认证授权(五)ACL源码解析

Kafka SASL认证授权(五)ACL源码解析。 官网地址:https://kafka.apache.org/ 一、ACL检查流程解析 一起看一下kafka server的启动与监听流程: Kafka -> KafkaServer -> SocketServer、KafkaRequestHandler 其中KafkaServer做相关的初始化,包括SocketServer 与 han…