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

这篇具有很好参考价值的文章主要介绍了rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、过期时间

  • 这里过一个知识点——过期时间,即对消息或队列设置过期时间(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后自动删除。
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
2. 创建后,会显示Exp,表示已设置过期时间。
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
3. 5s后再次查看,ceshi_1队列已自动删除。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

1.2 针对消息设置

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
2.ceshi_2队列创建完后同样也有个标志TTL,代表已对该队列的消息设置了过期时间。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
3. 现在对ceshi_2队列发布消息“wuhan”。
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

二、死信队列

  • 咱们前面铺垫讲了一下消息的过期时间,当消息过期后消费者收不到消息,这对于公司业务来说非常严峻,所以当消息过期后,它在队列中会变成死信队列。
  • 消息变成死信的几种情况:
    • 消息被拒绝 (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绑定。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
3. 将队列qingjun_queue与交换器qingjun_exchange绑定,这样一来,当qingjun_queue里存在死信时,会把死信发给baimu_exchange,再到死信队列baimu_queue里。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

2.2 死信队列原理

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
2. 此时消息在qingjun_queue队列里。
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
3. 等到了过期时间后,消息从qingjun_queue队列里消失,并存在了死信baimu_queue队列里。
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

2.3 延迟队列(特殊用法)

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

现在我有以下需求,刚下班,想一回到家就能吹到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”标识。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

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

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux
2. 创建第一条消息"beijing",优先级为10,创建第二条消息“wuhan”,优先级为4。beijing会先被消费,wuhan后被消费。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

四、回调队列

  • 回调队列,指在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. 生产者服务器接到信息后,再反序列化,恢复为内存中的表达方式,此时才会在回调队列中显示回复信息,再然后再并根据消息唯一标识符进行处理。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

4.3 监控页面上使用

  1. 在生产者服务器上发送消息时,指定correlation_id和reply_to参数。
    rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

  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”一词,代表设置为惰性队列。

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux

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

rabbitmq 过期时间,rabbitmq,rabbitmq,分布式,运维开发,运维,linux文章来源地址https://www.toymoban.com/news/detail-777034.html

到了这里,关于rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NetCore 使用 RabbitMQ (交换机/队列/消息持久化+mq高级特性+死信队列+延迟队列)

    目录 一、安装mq 二、实操 1、简单模式 2、工作模式 3、fanout扇形模式(发布订阅) 4、direct路由模式也叫定向模式 5、topic主题模式也叫通配符模式(路由模式的一种) 6、header 参数匹配模式 7、延时队列(插件方式实现) 参考资料: 1、我的环境是使用VMware安装的Centos7系统。MQ部署

    2023年04月09日
    浏览(87)
  • 什么是mq?可靠性、重复消息、重复消费、丢失、发送大文件、延迟、发送机制、重试、死信、幂等、有序、大小、过期、优先级、进了死信队列还能出来吗?

    “MQ” 指的是消息队列(Message Queue),是一种用于异步通信的技术。消息队列是一种中间件,用于在分布式系统中传递消息,使不同组件之间能够进行松散耦合的通信。它的核心思想是生产者将消息发送到队列,而消费者从队列中接收并处理消息。 消息队列的主要优点包括

    2024年02月06日
    浏览(45)
  • 消息队列中间件,RabbitMQ的使用,死信队列,延迟队列,利用枚举实现队列,交换机,RountKey的声明

    目录 0.交换机种类和区别 1.声明队列和交换机以及RountKey 2.初始化循环绑定 3.声明交换机 4.监听队列 4.1 监听普通队列 4.2监听死信队列  5.削峰填谷的实现 Direct Exchange(直连交换机) : 直连交换机将消息发送到与消息的路由键完全匹配的队列。它是最简单的交换机类型之一。

    2024年04月23日
    浏览(79)
  • RabbitMQ基础(2)——发布订阅/fanout模式 & topic模式 & rabbitmq回调确认 & 延迟队列(死信)设计

    1.rabbitmq队列方式的梳理,点对点,一对多; 2.发布订阅模式,交换机到消费者,以邮箱和手机验证码为例; 3.topic模式,根据规则决定发送给哪个队列; 4.rabbitmq回调确认,setConfirmCallback和setReturnsCallback; 5.死信队列,延迟队列,创建方法,正常—死信,设置延迟时间; 点对

    2024年02月10日
    浏览(43)
  • RabbitMQ延迟队列,死信队列配置

    延迟和死信队列的配置 延迟队列有效期一分钟,后进入死信队列,如果异常就进入异常队列 异常队列配置类

    2024年02月14日
    浏览(43)
  • 【RabbitMQ】RabbitMQ高级:死信队列和延迟队列

    在电商平台下单,订单创建成功,等待支付,一般会给30分钟的时间,开始倒计时。如果在这段时间内用户没有支付,则默认订单取消。 该如何实现? 定期轮询(数据库等) 用户下单成功,将订单信息放入数据库,同时将支付状态放入数据库,用户付款更改数据库状态。定

    2024年01月17日
    浏览(52)
  • 【RabbitMQ学习日记】——死信队列与延迟队列

    死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说, producer 将消息投递到 broker 或者直接到 queue 里了, consumer 从 queue 取出消息进行消费,但某些时候 由于特定的原因导致 queue 中的某些消息无法被消费 ,这样的消息如果没有后续的处理,就变成了死

    2024年02月06日
    浏览(49)
  • 如何保证消息的可靠性+延迟队列(TTL+死信队列+延迟队列)

    目录 1.如何保证消息的可靠性 1.1.消息的可靠投递 confirm机制 return机制 1.2.如何保证消息在队列中不丢失 1.3.确保消息能可靠的被消费掉 2.延迟队列 2.1.TTL 2.2.死信队列 2.3.延迟队列 3.如何防止消费者重复消费消息 在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重

    2024年02月15日
    浏览(53)
  • RabbitMQ之TTL+死信队列实现延迟队列

    RabbitMQ是一个流行的消息队列系统,它提供了许多有用的功能,其中之一是TTL(Time To Live)和死信队列。这些功能可以用来实现延迟队列,让我们来看看如何使用它们。 首先,什么是TTL?TTL是消息的存活时间,它可以设置为一个特定的时间段。如果消息在这个时间段内没有被

    2024年02月13日
    浏览(40)
  • RabbitMQ养成记 (10.高级特性:死信队列,延迟队列)

    这个概念 在其他MQ产品里面也是有的,只不过在Rabbitmq中稍微特殊一点 什么叫私信队列呢? 就是当消息成为 dead message之后,可以重新发到另外一台交换机,这个交换机就是DLX。 注意这里的有翻译歧义, 这里的DLX 指的是 交换机 ,而不是一个队列。 队列的消息长度 到达限制

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包