【学习笔记】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.mzph.cn/news/112446.shtml

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

相关文章

修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库,k8s)

一:安装docker。(所有服务器都要安装) 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…

如何通过SK集成chatGPT实现DotNet项目工程化?

智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 SemanticKernel 是什么? Semantic Kernel是一个SDK,它将OpenAI、Azure OpenAI和Hugging Face等大…

虚拟音频设备软件 Loopback mac中文版软件介绍

创建虚拟音频设备以从应用程序和音频输入设备获取声音,然后将其发送到音频处理应用程序,它就是—Loopback for Mac,Loopback mac为您提供高端工作室混音板的强大功能,有了它在Mac上传递音频会变得很容易。 Loopback for mac中文版…

Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

一、Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 通过defineProperty 两个属性,get及set get 属性的 getter 函…

Swift使用Embassy库进行数据采集:热点新闻自动生成器

概述 爬虫程序是一种可以自动从网页上抓取数据的软件。爬虫程序可以用于各种目的,例如搜索引擎、数据分析、内容聚合等。本文将介绍如何使用Swift语言和Embassy库编写一个简单的爬虫程序,该程序可以从新闻网站上采集热点信息,并生成一个简单…

GCC优化相关

文章目录 优化选项博文链接 单独设置某段代码优化等级博文链接 优化选项 -O/-O0:无优化(默认)-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。该模式在编译大型程序的时候会花费更多的时间和内存。在-O1 下,编译会尝试减少代码体积和代码…

Sarscape5.6版本中导入外部控制点、写入精密轨道文件与GACOS用于大气相位

SARscape中导入外部GCP点用于轨道精炼 https://www.cnblogs.com/enviidl/p/16524645.html在SAR处理时,有时会加入GCP点文件,SAR处理中用到的控制点分为两类:用于校正地理位置的几何控制点(Geometry GCP)和用于轨道精炼…

多测师肖sir_高级金牌讲师___ui自动化之selenium001

一、认识selenium (1)selenium是什么? a、selenium是python中的一个第三方库 b、Selenium是一个应用于web应用程序的测试工具,支持多平台,多浏览器,多语言去实现ui自动化测试,我们现在讲的Sel…

Atlassian Confluence OGNL表达式注入RCE CVE-2021-26084

影响版本 All 4.x.x versions All 5.x.x versions All 6.0.x versions All 6.1.x versions All 6.2.x versions All 6.3.x versions All 6.4.x versions All 6.5.x versions All 6.6.x versions All 6.7.x versions All 6.8.x versions All 6.9.x versions All 6.1…

RK3568笔记四:基于TensorFlow花卉图像分类部署

若该文为原创文章,转载请注明原文出处。 基于正点原子的ATK-DLRK3568部署测试。 花卉图像分类任务,使用使用 tf.keras.Sequential 模型,简单构建模型,然后转换成 RKNN 模型部署到ATK-DLRK3568板子上。 在 PC 使用 Windows 系统…

使用telegram机器人发送通知

文章目录 背景1 创建机器人2 与机器人的会话3 调用API让机器人发送消息 背景 在训练深度学习模型时,除了粗略估计外,很难预测训练何时结束。此外,我们可能还想随时随地查看训练情况,如果每次都需要登录回服务器的话并不方便。因此…

wordpress网站部署了ssl证书之后就排版混乱了

刚给自己的小网站部署了SSL证书,之后就发现https访问主页竟然乱套了。在手机上访问却是正常的。 直接上解决方案: 编辑网站根目录下的wp-config.php文件 在自定义文本处添加以下代码: if ($_SERVER[HTTP_X_FORWARDED_PROTO] https) $_SE…

PHP-FFMpeg 操作音视频

✨ 目录 🎈 安装PHP-FFMpeg🎈 视频中提取一张图片🎈 视频中提取多张图片🎈 调整视频大小🎈 视频添加水印🎈 生成音频波形🎈 音频转换🎈 给音频添加元数据🎈 拼接多个音视…

利用ArcGIS获取每一个冰川的中心位置经纬度坐标:要素转点和要素折点转点的区别

问题概述:下图是天山地区的冰川的分布,我们可以看到每一条冰川是一个面要素,要求得到每一个冰川(面要素)的中心经纬度坐标。 1.采用要素转点功能 选择工具箱的【数据管理工具】-【要素】-【要素转点】。完成之后再采用…

计算机基础知识36

数据库数据的演变史 ATM:1. 把数据都存在了文件中,文件名不规范 kevin|123 kevin123 kevin*123 2. 存储数据的文件越来越多,放在db文件夹,占用空间,查询存储不方便,速度慢 # 数据库软件能解…

lnmp架构部署Discuz论坛并配置重定向转发

lnmp架构部署Discuz论坛并配置重定向转发 文章目录 lnmp架构部署Discuz论坛并配置重定向转发环境说明部署Discuz论坛系统下载Discuz论坛系统代码包,官网地址如下:部署Discuz论坛系统步骤:解压安装Discuz源码包配置虚拟主机进入Discuz安装界面…

Janus: 逆向思维,以数据为中心的MoE训练范式

文章链接:Janus: A Unified Distributed Training Framework for Sparse Mixture-of-Experts Models 发表会议: ACM SIGCOMM 2023 (计算机网络顶会) 目录 1.背景介绍all-to-allData-centric Paradigm 2.内容摘要关键技术Janus细粒度任务调度拓扑感知优先级策略预取…

Android推送问题排查

针对MobPush智能推送服务在使用过程中可能出现的问题,本文为各位开发者们带来了针对MobPush安卓端推送问题的解决办法。 TCP在线推送排查 排查TCP在线收不到推送时,我们先通过客户端的RegistrationId接口获取设备的唯一标识 示例: MobPush…

代码随想录算法训练营第五十六天 | 1143.最长公共子序列、1035.不相交的线 、53. 最大子序和 动态规划

1143.最长公共子序列 视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili 代码随想录 (1)代码 1035.不相交的线 视频讲解:动态规划之子序列问题,换汤不换药 | Leet…

高数二阶导数例子

例子: 当 x 0 x 0 x0时 f(x) 1,当 x ≠ 0 x \ne 0 x0时, f ( x ) sin ⁡ x x f(x) \frac{\sin x}{x} f(x)xsinx​, 求f’(x)。 解: 二阶导数是导数的导数,按照定义为: f ′ ′ ( x ) lim ⁡ x →…