RabbitMQ-TTL机制

[RabbitMQ] 重试机制+TTL+死信队列 ???热门专栏:??Java基本语法(97平均质量分)??Collection与数据结构 (92平均质量分)??线程与网络(96平均质量分)??MySql数据库(93平均质量分)??算法(97平均质量分)??Spring(97平均质量分)??Redis(97平均质量分)??RabbitMQ(97平均质量分) 阅读详情

RabbitMQ的TTL机制

在这里插入图片描述

在支付类的场景中,创建订单成功后,一般会给30分钟左右的等待时间,如果在这段时间内用户没有支付,则默认订单取消。

那如何实现呢?

8.1 定期轮询(数据库等)

用户下单成功,将订单信息放入数据库,同时将支付状态放入数据库,用户付款更改数据库状态。定期轮询数据库支付状态,如果超过30分钟就将该订单取消。

优点:设计实现简单

缺点:需要对数据库进行大量的IO操作,效率低下。

8.2 定时操作-Timer

  public void timerTask() throws Exception {
    Timer timer = new Timer();

    TimerTask task =
        new TimerTask() {
          @Override
          public void run() {
            LocalDateTime outTime = LocalDateTime.now();
            System.out.println("用户没有付款,交易取消:" + outTime);
            timer.cancel();
          }
        };

    System.out.println("等待用户付款:" + LocalDateTime.now());
    // 在20秒后执行定时调用
    timer.schedule(task, 5 * 1000);

    Thread.sleep(7000);
  }

缺点:

  1. timers没有持久化机制。
  2. timers不灵活(只可以设置开始时间与重复间隔,但对于等待支付的场景是够用的)
  3. timers不能够利用池,一个timer一个线程。
  4. times没有真正的管理计划。

8.3 使用ScheduledExecutorService

  public void scheduleExecute() throws Exception {
    ThreadFactory factory = Executors.defaultThreadFactory();
    ScheduledExecutorService service = new ScheduledThreadPoolExecutor(10, factory);

    System.out.println("等待用户付款:" + LocalDateTime.now());

    service.schedule(
        new Runnable() {
          @Override
          public void run() {
            LocalDateTime outTime = LocalDateTime.now();
            System.out.println("用户没有付款,交易取消:" + outTime);
          }
        },
        // 等待5秒
        5,
        TimeUnit.SECONDS);

    Thread.sleep(7000);
  }

优点:可以多线程执行,一定程序上避免任何任务间的想到影响,单个任务异常不影响其他任务。

缺点:在高并情况下,不建议使用定时任务去做,因为太浪费服务器性能。不推荐。

8.4 RabbitMQ的TTL机制

TTL,time to live 的简称,即过期时间。

RabbitMQ可以对消息和队列两个维度来设置TTL。

任何消息中间件的容量和堆积都是有限的,如果有一些消息总是不被消费掉,那么需要有一种过期的机制来做兜底。

目前有两种方法可以设置消息的TTL。

  1. 通过Queue属性设置,队列中所有的消息使用相同的过期时间。
  2. 对消息自身进行单独的设置。每条消息的TTL可以不同。

如果两种方法一起使用,则消息的TTL以两者之间较小数值为准,通常来说,消息在队列中的生存时间一旦超过设置的TTL值时,就会变更“死信(Dead Message)”,消费者默认就无法再收到该消息。当然,“死信”也是可以被取出来消费的。

使用原生API操作

在队列上设置消息的过期时间

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class ProductTTL {
  public static void main(String[] args) throws Exception {

    ConnectionFactory factory = new ConnectionFactory();

    factory.setUri("amqp://root:123456@node1:5672/%2f");

    try (Connection connection = factory.newConnection();
        Channel channel = connection.createChannel(); ) {
      // 定义相关的参数
      Map<String, Object> param = new HashMap<>();

      // 设置队列的TTL,即此消息10秒后过期,
      param.put("x-message-ttl", 10000);
      // 设置队列的空闲时间,(如果队列没有消费者或者一直没有使用,队列可存活的时间)
      // 可以理解为没有消费者时,消息队列20秒后删除。
      param.put("x-expires", 20000);

      channel.queueDeclare("ttl.qu", false, false, false, param);

      for (int i = 0; i < 100; i++) {
        String sendMsg = "this is test msg :" + i;
        channel.basicPublish("", "ttl.qu", null, sendMsg.getBytes(StandardCharsets.UTF_8));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

启动生产者

检查队列的信息

[root@nullnull-os rabbitmq]# rabbitmqctl list_queues name,messages_ready,messages_unacknowledged,messages,consumers  --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
┌────────┬────────────────┬─────────────────────────┬──────────┬───────────┐
│ name   │ messages_ready │ messages_unacknowledged │ messages │ consumers │
├────────┼────────────────┼─────────────────────────┼──────────┼───────────┤
│ ttl.qu │ 100            │ 0                       │ 100      │ 0         │
└────────┴────────────────┴─────────────────────────┴──────────┴───────────┘

经过10秒后

[root@nullnull-os rabbitmq]# rabbitmqctl list_queues name,messages_ready,messages_unacknowledged,messages,consumers  --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
┌────────┬────────────────┬─────────────────────────┬──────────┬───────────┐
│ name   │ messages_ready │ messages_unacknowledged │ messages │ consumers │
├────────┼────────────────┼─────────────────────────┼──────────┼───────────┤
│ ttl.qu │ 0              │ 0                       │ 0        │ 0         │
└────────┴────────────────┴─────────────────────────┴──────────┴───────────┘

再经过10秒后

[root@nullnull-os rabbitmq]# rabbitmqctl list_queues name,messages_ready,messages_unacknowledged,messages,consumers  --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...

经过操作后可以发现,此消息队列中的消息存活了10秒,然后消息就被清空了,由于队列的存活时间设置为20秒,没有消费者,所以经过了20秒后,队列就被清空了。

还可以将消息指定在消息中,效果相同

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class ProductTTLMsg {
  public static void main(String[] args) throws Exception {

    ConnectionFactory factory = new ConnectionFactory();
    factory.setUri("amqp://root:123456@node1:5672/%2f");
    try (Connection connection = factory.newConnection();
        Channel channel = connection.createChannel(); ) {
      // 定义相关的参数
      Map<String, Object> param = new HashMap<>();
      // 设置队列的空闲时间,(如果队列没有消费者或者一直没有使用,队列可存活的时间)
      // 可以理解为没有消费者时,消息队列20秒后删除。
      param.put("x-expires", 20000);
      channel.queueDeclare("ttl.qu", false, false, false, param);

      for (int i = 0; i < 100; i++) {
        String sendMsg = "this is test msg :" + i;
        // 在消息上指定存活时间为8秒
        AMQP.BasicProperties properties =
            new AMQP.BasicProperties().builder().expiration("8000").build();
        channel.basicPublish("", "ttl.qu", properties, sendMsg.getBytes(StandardCharsets.UTF_8));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

还可以通过命令设置全局的TTL

rabbitmqctl set_policy TTL ".*" '{"message-ttl": 9000}' --apply-to queues

观察队列的policy信息

未设置策略前

[root@nullnull-os rabbitmq]# rabbitmqctl list_queues name,messages_ready,messages_unacknowledged,messages,consumers,policy  --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
┌───────────────┬────────────────┬─────────────────────────┬──────────┬───────────┬────────┐
│ name          │ messages_ready │ messages_unacknowledged │ messages │ consumers │ policy │
├───────────────┼────────────────┼─────────────────────────┼──────────┼───────────┼────────┤
│ ttl.tmp.queue │ 0              │ 0                       │ 0        │ 0         │        │
└───────────────┴────────────────┴─────────────────────────┴──────────┴───────────┴────────┘

设置策略后

[root@nullnull-os rabbitmq]# rabbitmqctl list_queues name,messages_ready,messages_unacknowledged,messages,consumers,policy  --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
┌───────────────┬────────────────┬─────────────────────────┬──────────┬───────────┬────────┐
│ name          │ messages_ready │ messages_unacknowledged │ messages │ consumers │ policy │
├───────────────┼────────────────┼─────────────────────────┼──────────┼───────────┼────────┤
│ ttl.tmp.queue │ 0              │ 0                       │ 0        │ 0         │ TTL    │
└───────────────┴────────────────┴─────────────────────────┴──────────┴───────────┴────────┘

默认规则:

  1. 如果不设置TTL,则表示此消息不会过期;
  2. 如果TTL设置为0,则表示除非此时可以直接将消息投递到消费者,否则该消息会被立即丢弃。
python实现序列比对之Needleman-wunsch算法 (附完整源码) 阅读详情

相关推荐

电力电子技术进阶:从基础到实战的完整学习路径

本文系统阐述了电力电子技术从基础到实战的完整学习路径。首先解析了电力电子作为“电能魔术师”的核心作用,随后深入剖析了数学工具、电路电磁场与半导体器件三大基础支柱。文章重点讲解了DC-DC、DC-AC、AC-DC等核心变换拓扑,并探讨了从经典PID到现代模型预测控制(MPC)的控制策略。最后,分享了硬件设计、软件调试、电磁兼容(EMC)等实战经验与前沿趋势,为学习者提供了清晰的进阶指南。

weixin_29204205的博客 447

14-RabbitMQ高级特性-TTL

14-RabbitMQ高级特性-TTL前言在业务开发中有时候会有这样的需求,例如 12306 购买车票,我们必须在30分钟内进行付款,如果超过30分钟,则该订单将会被自动取消。要满足这个需求,可以采用 TTL 的这个特性功能。TTLTTL 全称 Time To Live(存活时间/过期时间)。当消息到达存活时间后,还没有被消费,会被自动清除。RabbitMQ可以对消息设置过期时间,也可以对整个队列...

DevOps海洋的渔夫@专栏 1073

RK3588零拷贝视频流水线实战:用GStreamer+Mpp实现8K硬解与DRM显示

本文深入探讨了在RK3588平台上构建零拷贝视频流水线的工程实践。通过结合GStreamer与MPP,实现了从8K视频硬解到DRM显示的全流程硬件加速,有效解决了高分辨率视频处理中的DDR带宽瓶颈问题。文章详细解析了dma-buf数据流机制、管道构建与性能优化策略,为多路视频并发处理提供了高效的系统架构解决方案。

github5actions的博客 1169

RabbitMQ怎么实现延时支付?

RabbitMQ延时支付解决方案

sinat_40693969的博客 901

自动驾驶传感器选型实战:摄像头、激光雷达与毫米波雷达融合策略

自动驾驶感知系统的核心在于多传感器协同,而非单一技术优劣。摄像头擅长语义识别但受光照和天气制约;激光雷达提供高精度测距却面临成本、温漂与多径干扰等物理瓶颈;毫米波雷达则以全天候鲁棒性与精准测速成为安全底线的守门人。三者融合不是简单叠加,而是基于场景约束(如暴雨、强光、高速跟车)、成本边界(BOM控制)与时间窗口(量产节奏)的工程权衡。真实量产方案中,‘纯视觉’实为视觉主责+毫米波兜底,‘激光雷达上车’本质是用硬件真值加速算法迭代,而传统车企更倾向以毫米波为仲裁者协调冲突。理解这些底层原理,才能在传感器选型、

weixin_32495691的博客 276

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 398

ttl值设置多少才合适

之前,公司用户的手机app用户出现了手机无法联网,移动、联通、电信。就是因为ttl值设置的问题。 服务器 阿里云 centos 6.5 我们在解析域名时经常出现 TTL 这个字段,里面默认写的是10分钟。 另外,有时候我们PING某域名或IP的时候,会出现TTL= XXX。今天就这个问题细说如下: 一、什么是域名的TTL值? TT...

weixin_33937778的博客 2424

ubuntu20.04搭建QGC4.2编译环境

QGC 4.2ubuntu18.04也可以编译QGC4.2,但是由于GLBC版本较低,无法使用最新版的QTCreator,Ubuntu20.04可以使用最新版QTCreator。

超维空间科技的博客 1万+

【RabbitMQ】重试机制、TTL

对于RabbitMQ的重试机制以及过期时间的简单概述

weixin_73060900的博客 1971

【Go语言实战】(26) 分布式搜索引擎

基于go语言的分布式搜索引擎

面向生活编程 2380

FPGA/IC 秋招笔试/面试题总结(目录)

FPGA/IC 秋招笔试/面试题总结-目录介绍 文章目录FPGA/IC 秋招笔试/面试题总结-目录介绍一、FPGA内部资源1. 什么是FPGA2.FPGA内部资源二、同步时钟、同步/异步电路1.同步时钟2.同步/异步电路三、同步复位/异步复位1.同步复位2. 异步复位3. 异步复位同步释放四、同步FIFO/异步FIFO1.同步FIFO2.异步FIFO五、FIFO最小深度计算1.FIFO最小深度2.示例分析六、逻辑电平1.TTL电平标准2.LVTTL电平标准3.CMOS电平标准4.LVCOMS电平标准5.RS

Crazzy_M的博客 2万+

RabbitMQ 重试机制 和 TTL

在消息传递过程中, 可能会遇到各种问题, 如网络故障, 服务不可用, 资源不足... 这些问题可能导致消息处理失败. 为了解决这些问题, RabbitMQ 提供了重试机制, 允许消息在处理失败后重新发送. 但如果是程序逻辑引起的错误, 那么多次重试也是没有用的, 可以设置重试次数.

2401_85234841的博客 1070

19、时间触发通信与时间触发以太网技术解析

本文深入解析了时间触发通信和时间触发以太网(TTEthernet)技术,涵盖了其在实时系统中的应用,特别是安全关键领域如航空航天。文章详细介绍了TTEthernet的通信服务、协议参数化、时钟同步机制、诊断服务、故障隔离方法以及验证工作,并通过示例配置展示了其灵活性和可扩展性。TTEthernet通过引入确定性时间触发通信范式,在同一物理网络上实现了时间触发、速率受限和尽力而为三种流量类别的集成,为分布式实时系统提供了高可靠性和实时性保障。

efc12345678的博客 115

RabbitMQ TTL机制详解

在分布式系统中,消息队列扮演着至关重要的角色,它能够有效地解耦生产者和消费者,提高系统的可用性和伸缩性。然而,在实际应用中,我们常常会遇到这样一个问题:消息在队列中滞留时间过长,可能会占用过多的存储资源,甚至导致消息队列崩溃。为了解决这一问题,RabbitMQ 引入了 Time-To-Live(TTL)机制。RabbitMQ 的 Time-To-Live 机制允许我们为消息设置一个存活时间,一旦消息在队列中超过这个时间,它就会被自动删除。

JavaCodePro的博客 914

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RabbitMQ TTL机制解析与应用

在分布式系统中,消息队列扮演着至关重要的角色,它能够有效地解耦生产者和消费者,提高系统的可用性和伸缩性。然而,在实际应用中,我们可能会遇到这样的问题:当消息被发送到队列中后,如果消费者没有在规定的时间内处理完这条消息,那么这条消息可能会一直占用队列资源,影响系统的性能和稳定性。为了解决这一问题,RabbitMQ 引入了 Time-To-Live(TTL)机制。RabbitMQ 的 Time-To-Live 功能允许我们为每条消息设置一个存活时间,一旦消息在队列中停留超过了这个时间,它就会被自动删除。

AIHacksCash的博客 859

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【RabbitMQ】TTL机制

【RabbitMQ】TTL机制

qq_38377525的博客 537

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RabbitMQ 设置消息过期时间TTL机制

过期时间TTL 过期时间TTL表示可以对消息设置预期时间,消息超过这个时间就会被自动删除,有两种方式可以设置TTL 第一种是 我们创建一个队列的时候可以设置消息过期时间,单位是毫秒,每条进入该队列的消息过期时间都一样。 第二种是 直接对消息进行单独设置,每条消息的TTL可以不一样 接下来使用的是第一种方式 编写配置类 package com.hs.rabbitmq.config; import org.springframework.amqp.core.Binding; import org.spring

qq_44027353的博客 3737

RabbitMQ 消息过期机制(TTL):队列 TTL 与消息 TTL 的区别

RabbitMQ 的 TTL(Time To Live,生存时间)机制用于控制消息或队列的存活时间,防止消息无限期滞留。TTL 分为队列级别和消息级别,两者在作用对象、设置方式、行为结果上存在关键区别。下面我将逐步解释这些区别,确保内容基于真实可靠的 RabbitMQ 实现(版本 3.8+)。通过以上解释,您应该能清晰区分队列 TTL 和消息 TTL。实际应用中,根据需求选择合适的机制:如果需管理队列生命周期,用队列 TTL;如果需控制消息时效,用消息 TTL。如有具体场景问题,欢迎提供更多细节!

2501_93894306的博客 815

【RabbitMQ】重试机制 && TTL && 死信队列

RabbitMQ提供了重试机制和TTL(消息过期)功能来优化消息处理。重试机制分为自动确认和手动确认两种模式:自动模式下Spring捕获异常自动重试,需配置重试次数和间隔;手动模式下需自行实现重试逻辑,但可能导致消息积压。TTL可设置队列级(所有消息统一过期)或消息级(单条消息独立过期),以较小值为准。典型应用场景包括订单超时自动取消等。使用时需注意自动确认模式可能导致消息丢失,而手动确认可能引发消息堆积问题。

lirendada的博客 970

rabbitmq---TTL机制(二)

rabbitmq中ttl介绍

weixin_43811057的博客 3623

RabbitMq- TTL机制

在京东下单,订单创建成功,等待支付,一般会给30分钟的时间,开始倒计时。如果在这段时间内用户没有支付,则默认订单取消。 该如何实现? 定期轮询(数据库等) 用户下单成功,将订单信息放入数据库,同时将支付状态放入数据库,用户付款更 改数据库状态。定期轮询数据库支付状态,如果超过30分钟就将该订单取消。 优点:设计实现简单 缺点:需要对数据库进行大量的IO操作,效率低下。 Timer SimpleDateFormat simpleDateFormat = new SimpleDateFormat(.

小城我家 873

RabbitMQ之TTL机制

介绍了RaBBitMQ的ttl过期时间

凉茶铺的博客 1817

RabbitMQ 进阶:消息超时机制(TTL)实战详解

本文聚焦消息在队列中的“存活寿命”管理,从理论逻辑到 Spring Boot 实战,带你玩转 TTL (Time To Live) 核心配置。 核心技术要点:双维度设置: 队列 TTL:声明时通过 x-message-ttl 统一控制全队。 消息 TTL:发送时通过 MessagePostProcessor 灵活定义单条寿命。 执行逻辑:遵循“最短路径原则”,当两者并存时取最小值。 核心差异:详解“队列过期立即删除”与“消息过期惰性删除”的底层区别。 死信联动:超时消息如何自动转化为死信 (

南部余额的博客 844

消息队列基础面试题:RabbitMQ中的消息TTL(Time-To-Live)机制及其在消息过期管理中的作用

面试官:通过今天的讨论,我们对RabbitMQ的消息TTL机制有了更深入的了解。消息TTL是RabbitMQ中一个非常重要的功能,合理使用它可以显著提升消息队列的可靠性和效率。

qq_61302385的博客 1064
上一篇: RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
下一篇: RabbitMQ-死信队列
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值