首页 > 其他分享 >RabbitMq---延时队列

RabbitMq---延时队列

时间:2023-10-24 10:57:37浏览次数:35  
标签:设置 队列 RabbitMq --- 过期 消息 延时 5min

应对场景

订单创建后--->开始锁库存

而如果之后的服务出现异常,在订单创建的簇点会自动设置逻辑来处理

但是之后解锁库存则需要延时队列来解决

采用定时任务检查的话

有以下问题:

  1. 时效性(存在较大的时间误差):即使订单支付倒计时30min但是可能你正好在定时任务检查之后的1min时创建,那么下次检查你也会避过,只有到下下次才会被发现
  2. 消耗系统内存
  3. 增加数据库的压力

所以使用了延时队列

名词

TTL:存活时间

死信:

1. 已经超过存活时间的信息
1. 被consumer拒绝且设置了不再放入队列中

延时队列实现有两个方式:

设置队列过期时间实现延时队列!

设置消息过期时间实现延时队列

更建议的是:设置延时队列的方式

因为通过消息延时队列的方式,例如我们先有一个5min过期的,然后有个1min过期的,还有个1s过期的,按理说应该是1min这些的会快于5min的成为死信,但是rabbitMQ的检查是否TTL结束,是惰性的,也就是查到个5min的没过期会之后等个5分钟,再过来检查,这就导致1min的绝对在5min后成为死信,与我们的逻辑就不相符了

第一种方式具有以下优势:

  • 性能优化:使用第一种方式,RabbitMQ 可以在队列过期时进行惰性检查(lazy check),只有在需要时才会删除过期的队列。这样可以减少系统资源的占用,避免频繁的消息删除操作。
  • 简化消息管理:给队列设置过期时间意味着消息的过期时间是固定的,而不需要为每个消息单独设置过期时间。这样可以简化消息的管理和维护。
  • 避免消息堆积:如果给消息设置过期时间,那么即使消费者无法及时处理消息,消息仍然会堆积在队列中,占用系统资源。而给队列设置过期时间可以确保在一定时间内没有消费者时,队列及其相关的消息会自动删除,避免了消息的堆积问题。

Problem

1

如果配置Configuration后

在里面创建一些交换机和队列后打开rabbitMq发现没有作用

tips:弄一个

@RabbitListener(queues = "stock.release.stock.queue")
public void handle(Message message) {

}

即可,rabbitMQ会重新扫描

2

如果消息有一个获取不到记得看看queue的详情,

看看是不是多个consumer,尤其是我们在MyMQconfig里面有没有配置多个

标签:设置,队列,RabbitMq,---,过期,消息,延时,5min
From: https://www.cnblogs.com/seamount3/p/17784218.html

相关文章

  • URPF---源地址校验
    uRPF技术:单播逆向路径转发(UnicastReversePathForwarding),其主要功能是防止基于源地址欺骗的网络攻击行为。在没有配置uRPF技术时,网络设备不检查数据包的源地址,只关心能不能到达目的地址。由此,产生了虚假源地址欺骗网络攻击行为,例如基于源地址欺骗的DOS攻击和DDOS攻击......
  • Tita 升级|任务中心-看板模式上线
    一、任务中心-看板模式介绍Tita-OKR和新绩效一体化管理平台看板模式可将任务进行多种分类,并将每种分类的任务可视化在一个看板上,以帮助人员更好地跟踪和管理任务。使用场景1:在查看任务中心数据时,状态、优先级等不同数据的任务混杂在一起,没办法有序查看解决方案: 支持按状......
  • springcloud-gateWay
    基础模板spring:cloud:gateway:routes: -id:gulimall-search#别重复就行 uri:lb://gulimall-search#对应微服务的applicationName predicates: -Path=/api/search/**predicates的概念每一个route对应一个--->RouteDefi......
  • spring-cloud 配置管理
    作用:实现配置热更新实现网关配置热部署配置模板spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://${db.gulimall.host:192.168.229.128}:${db.gulimall.port:3306}/{$db.gulimall.database:my_db}username:${db.gulima......
  • DevExpress WinForms地图组件 - 轻松集成地图功能到应用程序
    DevExpressWinForms地图控件允许您在WinForms应用程序中合并地图服务,您可以选择现有的地图资源,如如Bing或OpenStreetMap,或者在公司网络中创建自己的地图数据服务器。DevExpressWinForms地图控件完全支持矢量和笛卡尔坐标地图。DevExpressWinForms有180+组件和UI库,能为Windows......
  • Maven-安装与配置
    1.下载maven从官方下载maven,下载页面:http://maven.apache.org/download.cgi 2.安装mavenmaven压缩包解压到一个没有中文,空格或其他特殊字符的文件夹内即可使用。 3.配置maven环境变量maven的使用是在jdk的基础上,所以电脑必须有jdk(1).新增环境变量:MAVEN_HOME (2)......
  • uniapp项目引入uView-ui
    通过npm下载//如果您的根目录没有package.json文件的话,请先执行如下命令://npminit-ynpminstalluview-ui//更新//npmupdateuview-ui配置步骤1.引入uView主JS库在项目根目录中的main.js中,引入并使用uView的JS库,注意这两行要放在importVue之后。//main.j......
  • oracle-数据库备份
    热备份数据库备份就是将数据库的内容全部复制出来保存到计算机的另一个位置或者其他存储设备上。数据库备份分为物理备份和逻辑备份。使用export/import的方式对数据进行导入导出操作。冷备份脱机备份称为冷备份,使用管理员身份的用户使用shutdown命令关闭数据库的服务,之后复......
  • oracle-存储过程
    存储过程通俗的理解就是就是一个执行过程,调用的时候给他所需要的需求就会对数据库进行操作,相当于我们自己手写Sql,只不过有了存储过程只要调用一下传给他参数他就会帮我们写,比较方便,灵活的运用存储过程会让我们开发很方便 创建存储过程create[orreplace]procedure......
  • C++常用语法知识--数据类型
    C++常用语法知识--数据类型C++为用户提供了7种基本C++数据类型:类型关键字字节大小布尔型bool1字符型char1有符号字符型signedchar1无符号字符型unsignedchar1整型int4有符号整型signedint4无符号整型unsignedint4短整型int2......