rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列

news2024/10/5 21:21:54

文章目录

  • 一、过期时间
    • 1.1 针对队列设置
    • 1.2 针对消息设置
  • 二、死信队列
    • 2.1 死信交换器
    • 2.2 死信队列原理
    • 2.3 延迟队列(特殊用法)
  • 三、优先级队列
    • 3.1 监控页面创建优先级队列
    • 3.2 监控页面创建优先级消息
  • 四、回调队列
    • 4.1 RPC的定义
    • 4.2 PRC工作机制
    • 4.3 监控页面上使用
  • 五、惰性队列
    • 5.1 监控页面上使用

一、过期时间

  • 这里过一个知识点——过期时间,即对消息或队列设置过期时间(TTL)。一旦消息过期,消费就无法接收到这条消息,这种情况是绝不允许存在的,所以官方就出了一个对策——死信队列,死信队列最初出现的意义就是为了应对消息过期丢失情况的手段之一。

  • 那么过期时间具体怎么设置呢?运维人员只需了解外部层面的,因为对消息设置过期时间有两个维度,一个是定义消息本身属性时开发人员在代码里加进去的一个参数(初中级运维看不到),另外一个是定义队列属性的,可以从web监控页面查看。

  • 什么是过期时间?

    • 指对消息和队列设置 过期时间,简称TTL,是Time to Live 的简称。
  • TTL设置对象和方式?

    • 针对队列设置过期时间,从队列创建开始算起,一旦达到设置的过期时间后,队列自动删除,队列里的所有消息都会被删除。在web监控中的“ x-expires ”参数,也是上一章节中咱们提到过的。
    • 针对消息设置过期时间,有两个维度:
      • 第一个是,通过队列属性设置,队列中所有消息都有相同的过期时间。在web监控中的“ x-message-ttl ”参数。
      • 第二个是,对消息本身进行单独设置,每条消息的 TTL 可以不同。此种方式只能通过代码来设置,在web监控中发送消息已不支持该种消息参数。
      • 如果两种维度一起使用,则消息的 TTL 以两者之间较小的那个数值为准。

1.1 针对队列设置

1.创建ceshi_1队列时,使用“x-expires”参数指定过期时间,单位毫秒。我这里设置的是5s后自动删除。
在这里插入图片描述
2. 创建后,会显示Exp,表示已设置过期时间。
在这里插入图片描述
3. 5s后再次查看,ceshi_1队列已自动删除。

在这里插入图片描述

1.2 针对消息设置

  • 这里演示第一种维度设置,通过对队列参数设置来控制消息过期时间。此种方式设置后,所有进入该队列的消息只能存活自定义的那个时间。
  1. 创建ceshi_2队列时,通过指定“x-message-ttl”参数设置该队列里的消息过期时间,单位毫秒。我这里设置的是5s,代表进入ceshi_2队列的所有信息都只会保留5s,之后自动删除。

在这里插入图片描述
2.ceshi_2队列创建完后同样也有个标志TTL,代表已对该队列的消息设置了过期时间。

在这里插入图片描述
3. 现在对ceshi_2队列发布消息“wuhan”。
在这里插入图片描述
在这里插入图片描述

  1. 5s时间到,消息自动删除,队列显示挤压队列为0。

在这里插入图片描述

二、死信队列

  • 咱们前面铺垫讲了一下消息的过期时间,当消息过期后消费者收不到消息,这对于公司业务来说非常严峻,所以当消息过期后,它在队列中会变成死信队列。
  • 消息变成死信的几种情况:
    • 消息被拒绝 (Basic.Reject/Basic.Nack),并且设置 requeue 参数为 false。
    • 消息过期。
    • 队列达到最大长度,即将删除一些。

2.1 死信交换器

  • 死信交换器是什么?
    • 死信交换器,英文名为Dead-Letter-Exchange,简称DLX,也有人称之为死信邮箱。当消息在一个队列中变成死信 (dead message) 之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。
    • DLX 也是一个正常的交换器,和一般的交换器没有区别,只是在创建某个队列时指定某个交换器为死信交换器,是队列的属性配置。当这个队列中存在死信时,该死信会重新发布到设置的 DLX 上去,进而被路由到死信队列。
  1. 现在有两个正常交换器,都开启了持久化。其中qingjun_exchange交换器还没有绑定队列,baimu_exchange交换器通过baimu-baimu_key绑定键与队列baimu_queue绑定。

在这里插入图片描述
在这里插入图片描述

2.创建队列qingjun_queue时,通过参数“x-dead-letter-exchange”指定死信交换器,也可以通过“x-dead-letter-routing-key”指定绑定键,如果没设置绑定键,则使用死信交换器原来的绑定键。比如我这里没有指定死信交换器绑定键就还是使用原来的绑定键“baimu-baimu_key”。

在这里插入图片描述
在这里插入图片描述
3. 将队列qingjun_queue与交换器qingjun_exchange绑定,这样一来,当qingjun_queue里存在死信时,会把死信发给baimu_exchange,再到死信队列baimu_queue里。

在这里插入图片描述

2.2 死信队列原理

  • 如下图,baimu_exchange为死信交换器,baimu_queue为死信队列。

在这里插入图片描述

  1. 发一条“wuhan”消息给qingjun_queue队列。

在这里插入图片描述
2. 此时消息在qingjun_queue队列里。
在这里插入图片描述
3. 等到了过期时间后,消息从qingjun_queue队列里消失,并存在了死信baimu_queue队列里。
在这里插入图片描述
在这里插入图片描述

2.3 延迟队列(特殊用法)

  • 延迟队列并非是rabbitmq的直接功能,而是通过死信队列和过期时间配合使用演练模拟延迟队列的一种用法。
  • 什么是延迟队列?
    • 延迟队列存储的对象是对应的延迟消息,所谓“延迟消息”是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
    • 回看死信队列的工作流程,当我想拿死信队列里的消息时,这种情况下,这个死信队列也是延迟队列。为什么我会想拿死信队列里的消息呢?有以下场景可以适用。
  • 适用场景
    • 在订单系统中,一个用户下单之后通常有 30 分钟的时间进行支付,如果 30 分钟之内没有支付成功,那么这个订单将进行异常处理,这时就可以使用延迟队列来处理这些订单了。
    • 当我下班后,还在公司们口就可以通过手机远程遥控家里的空调在我上地铁后就开始制冷工作,这时就可以把我的请求指令消息放发送到设有过期时间的队列中,过期时间就是我从公司走到地铁的时间,此时消息过期发送到死信队列里,再推送到消费者空调开始制冷。这里的死信队列就可以看作延迟队列。

在这里插入图片描述

现在我有以下需求,刚下班,想一回到家就能吹到25°C制冷、自动风速模式的空调。从公司走到地铁站需要20分钟,在我达到地铁站时家里的空调开始以16°C、5级风速模式制冷,该模式下制冷时间为我地铁通勤时间10分钟,等我下地铁时再调成25°C、2级风速模式制冷,下地铁到家需要10分钟,这10分种内空调需要调成25°C、自动风速模式工作,等我回到家正好是25°C、自动风速。

  • 在公司门口就远程控制家里空调,设置三个定时工作:
    • 第一个定时是在20分钟后开始工作,这一指令是第一条消息,完全匹配到绑定键_1到达queue_1,20分钟后消息过期,到达延迟队列_1,消费者开始消费第一条消息。
    • 第二个定时是在30分钟后开始工作,这一指令是第二条消息,完全匹配到绑定键_2到达queue_2,30分钟后消息过期,到达延迟队列_2,消费者开始消费第二条消息。
    • 第三个定时就是40分钟后开始工作,这一指令是第三条消息,完全匹配到绑定键_3到达queue_3,40分钟后消息过期,到达延迟队列_3,消费者开始消费第三条消息。
  • 20分钟后,我走到地铁站,开始消费第一条消息,空调开始以16°C、5级风速制冷。
  • 地铁通勤时间10分钟,此时开始消费第二条消息,空调开始以25°C、2级风速制冷。
  • 10分钟后下地铁,第三条消息开始消费,空调调成25°C、自动风速模式。
  • 等我回到家时,空调温度正好是25°C、自动风速。

三、优先级队列

  • 通过参数 x-max-priority可以设置优先级队列和优先级消息。优先级高的队列具有高的优先权,优先级高的消息具备优先被消费的特权。
  • 适用场景
    • 业务数据大,大到经常挤压,但又要满足业务需求。
    • 优先级队列的使用需要看业务情况的,如果消费者的消费速度大于生产者的速度且 Broker 中没有消息堆积情况下,对发送的消息设置优先级就没有什么实际意义了。因为生产者刚发送完一条消息就被消费者消费了,那么就相当于 Broker 中至多只有一条消息,对于单条消息来说优先级是没有什么意义的。

3.1 监控页面创建优先级队列

  1. 创建wuhan_queue队列时添加参数x-max-priorit,就创建了优先级队列,并显示有“Pri”标识。

在这里插入图片描述

3.2 监控页面创建优先级消息

  • 消息的优先级最大不能超过队列的最大优先级,默认最低为0。
  • 优先级高的先被消费,优先级低的后被消费。
  1. 在web监控里创建消息时,可以指定消息相关参数,当前版本有效参数如下显示,其中就有个优先级的参数priority。

在这里插入图片描述
2. 创建第一条消息"beijing",优先级为10,创建第二条消息“wuhan”,优先级为4。beijing会先被消费,wuhan后被消费。

在这里插入图片描述

四、回调队列

  • 回调队列,指在RPC调用过程中需要使用的回复的队列。

4.1 RPC的定义

  • RPC,是 Remote Procedure Call 的简称,即远程过程调用。
  • 它是一种通过网络从远程计算机上请求服务,而不需要了解底层网络的技术。RPC 的主要功用是让构建分布式计算更容易在提供强大的远程调用能力时不损失本地调用的语义简洁性。
    • 打个比方,现有两台服务器A和B,一个应用部署在 A 服务器上,想要调用B服务器上应用提供的函数或方法,由于不在同一个服务器上不能直接调用,所以需要需要通过网络来表达调用的语义和传达调用的数据。
  • RPC 的协议有很多,比如CORBA、Java RMI、WebService 的 RPC 风格、Hessian、Thrift 、Restful API。

4.2 PRC工作机制

RPC工作流程

  1. RPC客户端在生产者服务器上,RPC服务端在消费者服务器上。
  2. 生产者向一个普通队列baimu_queue发送一条消息,消息内容为调用消费者服务器上的函数A,并通过reply_to参数指定消费者接收到生产者的信息并处理完后发送到哪个队列上,此队列就称之为回调队列,通过correlation_id参数设置消息唯一表示符,好让生产者识别是哪一个请求回复的消息。
    • 消息是通过底层的网络协议传递到消费者服务器上,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给消费者服务器。
  3. 消费者收到消息时,进行调用函数A业务处理,业务处理完成后,将处理结果和收到消息的唯一标识符打包发送到回调队列qingjun_queue,这条消息可以称为响应消息。
    • 消费者服务器收到消息后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。将返回值再以序列化方式放给生产者服务器。
  4. 生产者服务器接到信息后,再反序列化,恢复为内存中的表达方式,此时才会在回调队列中显示回复信息,再然后再并根据消息唯一标识符进行处理。

在这里插入图片描述

4.3 监控页面上使用

  1. 在生产者服务器上发送消息时,指定correlation_id和reply_to参数。
    在这里插入图片描述

  2. reply_to参数指定的回到队列需要先创建好,可以是一个普通队列,只是用来接收回调消息的。这里就不多此一举了。

五、惰性队列

  • 默认情况下,当生产者将消息发送到rabbitmq时,队列中的消息会尽可能地存储在内存之中,这样可以更加快速地将消息发送给消费者。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份。当消费者由于各种各样的原因,比如消费者下线、宕机、由于维护而关闭等原因致使长时间内不能消费消息而造成堆积时,使用惰性队列就可以很好解决了。

  • 惰性队列作用

    • 惰性队列会将接收到的消息直接存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中。
    • 它的出现就是可以有效解决消费者异常时可以存储大量挤压得消息,所以惰性队列能支持更多的消息存储。
  • 惰性队列对服务器资源要求:

    • 会增加磁盘I/O读写能力。惰性队列是将消息直接存盘,不管是持久化的或者是非持久化的,这样可以减少了内存的消耗,但是会增加 I/O 的使用,如果消息是持久化的,那么这样的 I/O操作不可避免。
    • 注意如果惰性队列中存储的是非持久化的消息,内存的使用率会一直很稳定,但是重启之后消息一样会丢失。
  • 队列模式

    • 分Default 持久化模式和 Transient瞬时模式,前者队列持久化,可以保证数据的高可靠;后者数据只在内存里,服务器关闭数据消失。
    • 在高版本中,比如我这里的3.11.5版本,可以在创建队列指定“x-queue-mode”参数设置该队列为惰性队列。

5.1 监控页面上使用

  • 如下图,在创建队列test_queue时,添加参数“x-queue-mode”会默认带出“lazy”一词,代表设置为惰性队列。

在这里插入图片描述

  • 惰性队列也同样会显示一个标识“Args”。

在这里插入图片描述

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

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

相关文章

java本地socket服务端暴露至公网访问【内网穿透】

Java 服务端demo环境 jdk1.8 框架:springbootmaven 开发工具:IDEA 在pom文件引入第三包封装的netty框架maven坐标 <dependency><groupId>io.github.fzdwx</groupId><artifactId>sky-http-springboot-starter</artifactId><version>0.…

叮叮当~~叮叮当~~|您有一份白玉兰酒店圣诞节豪礼等待抱走!

不知不觉2022年已经临近尾声 全国各地都已经放开了 相信有很多小伙伴在这一年 都没有好好的出来浪一浪 在即将到来的圣诞节 各地的圣诞玩乐都已经齐齐亮相 同时 白玉兰酒店客房 也已迎来了圣诞系列主题 是时候计划一场完美的圣诞之旅了 兰小姐为您准备了丰富多彩的圣…

【苹果家庭群发推送】软件安装Apple推送是一种基于IMESSAGE平台的新信息推送功效的营销软件

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

DevOps-7:Jenkins API介绍

前言&#xff1a; 为什么要使用Jenkins的API&#xff1f; 我在使用Jenkins的过程中&#xff0c;觉得Jenkins的UI还是有不少问题的&#xff1a; UI性能差&#xff0c;尤其是有一些任务在构建中时&#xff0c;UI非常卡顿&#xff0c;等个十来秒都正常&#xff0c;极端时甚至会崩…

LeetCode 221. 最大正方形

LeetCode 221. 最大正方形 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1",&quo…

【OpenCV-Python】教程:8-1 图像去噪 Image Denoising

OpenCV Python 图像去噪 Image Denoising 【目标】 非局部均值去噪算法去除图像中的噪声。 cv2.fastNlMeansDenoising() , cv2.fastNlMeansDenoisingColored() etc. 【理论】 在前面的章节中&#xff0c;我们已经看到了许多图像平滑技术&#xff0c;如高斯模糊&#xff0c…

1、MYSQL基础(DDL DML DCL)

&#xff08;1&#xff09;关于字段修改 change和modify的异同&#xff1a; 同&#xff1a;可以修改表的定义 异&#xff1a;change需要写两次列名&#xff0c;不方便&#xff0c;但是change可以修改表名&#xff0c;modify不可 &#xff08;2&#xff09;多表更新&#xff…

店铺如何快速实现数字化管理?不妨参考一下管理系统

百数店铺管理系统主要是以门店管理为核心&#xff0c;该应用管理涵盖商品、订单、库存、客户、采购、财务、营销等功能体系&#xff0c;维度数据分析&#xff0c;智能指导门店经营&#xff0c;账目清晰一目了然&#xff0c;店铺经营更高效。 1、销售看板 该分析报表里通过销售…

手把手教你玩转 Excel 数据透视表

1. 什么是数据透视表 数据透视表是一种可以快速汇总、分析大量数据表格的交互式分析工具。使用数据透视表可以按照数据表格的不同字段从多个角度进行透视&#xff0c;并建立交叉表格&#xff0c;用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。 使用数据透视表…

【Vue + Koa 前后端分离项目实战6】使用开源框架==>快速搭建后台管理系统 -- part6 前端实现期刊列表管理【增删查改】

要把努力当成一种习惯&#xff0c;而不是一时热血。 对应后端部分章节回顾&#xff1a; 【Vue Koa 前后端分离项目实战4】使用开源框架&#xff1e;快速搭建后台管理系统 -- part4 后端实现【增删改查】功能_小白Rachel的博客-CSDN博客 目录 一、前端项目准备 1.运行项目 …

支持百问网T113 D1-H D1s V853 V851s 等开发板 使用 Tina Linux NOR Flash文件系统 开发指南

此文章内容适用于 百问网T113 D1-H D1s V853 V851s 等开发板&#xff0c;开发板详情请访问 www.100ask.net 。 1 简介 编写目的 此文档描述Sunxi NOR 模块的使用方法&#xff0c;为相关人员调试提供指导 适用范围 boot0: 适用于brandy-2.0u-boot: 适用于u-boot-2018kernel: …

记录内值排序

记录内值排序 【问题】 could anyone please suggest a way to accomplish this. i have a table which consists of six columns : Table name : orders num1 number, num2 number , num3 number , num4 number , num5 number , num6 number there is a routine which fi…

修改后的代码只进行了git add操作不小心给他恢复了怎么找回来

一份干净的代码在main.js里加了一行console.log(666)&#xff0c;并且只进行了git add 然后不小心给他reset了&#xff01; git reset --hard哦豁&#xff0c;没了&#xff1f; 别急一样可以恢复&#xff0c;我们先执行 git fsck --lost-found然后我们去项目的.git下找到这个…

初级软件测试面试会问什么 除了常见问题,技术题也是重点

众所周知&#xff0c;面试是我们进入一个公司的门槛&#xff0c;面试者只有通过了面试才能进入公司&#xff0c;因此&#xff0c;很多新手测试人就想要知道&#xff0c;自己去面试初级软件测试的岗位&#xff0c;HR们都会问些什么样的问题&#xff1f;自己可以从哪些方面做准备…

多线程顺序运行的 4 种方法

1、在子线程中通过join()方法指定顺序 通过join()方法使当前线程“阻塞”&#xff0c;等待指定线程执行完毕后继续执行。 举例&#xff1a;在线程thread2中&#xff0c;加上一句thread1.join()&#xff0c;其意义在于&#xff0c;当前线程2运行到此行代码时会进入阻塞状态&…

FineReport填报报表常用属性方法

1、去除填报页面选中单元格时的黑色边框 // 加载结束事件 _g().curLGP.hideSelectFrame(); 2、 获取单元格焦点 预览填报报表时&#xff0c;希望页面加载完成后&#xff0c;自动将光标定位在某个控件中&#xff0c;可以直接编辑。 // 获取A2单元格 var cell _g().curLGP.getT…

风控模型算法

目录1 蚂蚁金服2 陆金所3 京东金融4 苏宁金融5 百度金融6 腾讯理财通7 宜信8 钱大掌柜9 万达金融10 网易理财11 美团金融主要是整理目前市面上的风控模型以及风控算法。1 蚂蚁金服 &#xff08;1&#xff09;对接第三方征信公司芝麻信用分&#xff0c;通过用户信用历史、行为偏…

echarts的xAxis和yAxis——x轴y轴以及网格线的详细配置

先看一下xAxis和yAxis配置的图表效果 下图详细的标注了图表中x轴y轴可见的内容 说明一下&#xff1a; x轴y轴在echarts配置项里&#xff0c;从内容上来说大体上没有太大区别&#xff0c;x轴能用的配置项y轴基本也可以用。 通过配置xAxis和yAxis可实现内容 坐标轴箭头的样式&…

Python量化交易01——构建基础策略

参考书目:深入浅出Python量化交易实战 量化交易是很早就想开的栏目了&#xff0c;之前没时间。现在正好放寒假&#xff0c;然后也找到了一本合适的书可以进行学习。 本次第一章就介绍一下简单的量化流程和一个简单的策略。 量化交易顾名思义就是用代码去验证交易策略是否赚钱…

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

摘要&#xff1a;能不能在ARM板上运行Ubuntu呢&#xff1f;答案肯定是可以的&#xff0c;Ubuntu是Linux系统的一种&#xff0c;可以简单的将Ubuntu理解为一个根文件系统&#xff0c;和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移…