RMQ延迟队列

news2025/1/13 10:04:02

目录

  • 一、场景
  • 二、TTL和DLX
  • 三、开发步骤

一、场景

“订单下单成功后,15分钟未支付自动取消”
1.传统处理超时订单
采取定时任务轮训数据库订单,并且批量处理。其弊端也是显而易见的;对服务器、数据库性会有很大的要求,
并且当处理大量订单起来会很力不从心,而且实时性也不是特别好。当然传统的手法还可以再优化一下,
即存入订单的时候就算出订单的过期时间插入数据库,设置定时任务查询数据库的时候就只需要查询过期了的订单,
然后再做其他的业务操作

2.rabbitMQ延时队列方案
一台普通的rabbitmq服务器单队列容纳千万级别的消息还是没什么压力的,而且rabbitmq集群扩展支持的也是非常好的,
并且队列中的消息是可以进行持久化,即使我们重启或者宕机也能保证数据不丢失

二、TTL和DLX

rabbitMQ中是没有延时队列的,也没有属性可以设置,只能通过死信交换机(DLX)和设置过期时间(TTL)结合起来实现延迟队列

1.TTL
TTL是Time To Live的缩写, 也就是生存时间。
RabbitMq支持对消息和队列设置TTL,对消息这设置是在发送的时候指定,对队列设置是从消息入队列开始计算, 只要超过了队列的超时时间配置, 那么消息会自动清除。
如果两种方式一起使用消息的TTL和队列的TTL之间较小的为准,也就是消息5s过期,队列是10s,那么5s的生效。
默认是没有过期时间的,表示消息没有过期时间;如果设置为0,表示消息在投递到消费者的时候直接被消费,否则丢弃。

 设置消息的过期时间用 x-message-ttl 参数实现,单位毫秒。
 设置队列的过期时间用 x-expires 参数,单位毫秒,注意,不能设置为0。

 消息:生产者 -> 交换机 消息在生产者制造消息的时候就开始计算了TTL  TTL=5
 队列:生产者 -> 交换机 -> 路由键 -> 队列 当消息送达到队列的时候才开始计算TTL  TTL=10

2.DLX和死信队列
DLX即Dead-Letter-Exchange(死信交换机),它其实就是一个正常的交换机,能够与任何队列绑定。

 死信队列是指队列(正常)上的消息(过期)变成死信后,能够发送到另外一个交换机(DLX),然后被路由到一个队列上,
 这个队列,就是死信队列

 成为死信一般有以下几种情况:
 消息被拒绝(basic.reject or basic.nack)且带requeue=false参数
 消息的TTL-存活时间已经过期
 队列长度限制被超越(队列满)

 
 注1:如果队列上存在死信, RabbitMq会将死信消息投递到设置的DLX上去 ,
 注2:通过在队列里设置x-dead-letter-exchange参数来声明DLX,如果当前DLX是direct类型还要声明
      x-dead-letter-routing-key参数来指定路由键,如果没有指定,则使用原队列的路由键
  1. 延迟队列
    通过DLX和TTL模拟出延迟队列的功能,即,消息发送以后,不让消费者拿到,而是等待过期时间,变成死信后,发送给死信交换机再路由到死信队列进行消费

在这里插入图片描述

三、开发步骤

编写配置类

package com.xlb.rabbitmqprovider.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


@Configuration
public class RabbitDLXConfig {
    public final static String NORMAL_QUEUE = "normal_queue";
    public final static String NORMAL_ROUTING_KEY = "normal_routing_key";
    public final static String NORMAL_EXCHANGE = "normal_exchange";

    public final static String DELAY_QUEUE = "delay_queue";
    public final static String DELAY_ROUTING_KEY = "delay_routing_key";
    public final static String DELAY_EXCHANGE = "delay_exchange";


//    普通交换机以及普通队列
    @Bean
    public Queue normalQueue(){
        Map map = new HashMap();
        map.put("x-message-ttl", 20000);//message在该队列queue的存活时间最大为10秒
        map.put("x-dead-letter-exchange", DELAY_EXCHANGE); //x-dead-letter-exchange参数是设置该队列的死信交换器(DLX)
        map.put("x-dead-letter-routing-key", DELAY_ROUTING_KEY);//x-dead-letter-routing-key参数是给这个DLX指定路由键

        return new Queue(NORMAL_QUEUE, true, false, false, map);
    }

    @Bean
    public DirectExchange normalExchange(){
        return new DirectExchange(NORMAL_EXCHANGE, true, false);
    }

    @Bean
    public Binding normalBinding(){
        return BindingBuilder.bind(normalQueue())
                .to(normalExchange())
                .with(NORMAL_ROUTING_KEY);
    }

//    死信交换机及延迟队列
    @Bean
    public Queue delayQueue(){
        return new Queue(DELAY_QUEUE);
    }

    @Bean
    public DirectExchange delayExchange(){
        return new DirectExchange(DELAY_EXCHANGE);
    }

    @Bean
    public Binding delayBinding(){
        return BindingBuilder.bind(delayQueue())
                .to(delayExchange())
                .with(DELAY_ROUTING_KEY);
    }


}

启动测试
在这里插入图片描述
在这里插入图片描述

编写消费者

package com.xlb.rabbitmqconsumer.conf;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
@RabbitListener(queues = {"delay_queue"})
public class DLXReceiver {
    @RabbitHandler
    public void handler(Map msg){
        System.out.println("通过订单编号,查询数据库,修改订单状态为已支付或者待支付,如果为待支付,那么库存要重新加回去");
        System.out.println(msg);
    }
}

在这里插入图片描述

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

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

相关文章

jeecg-boot前端实现表格插槽、定制化修改

大家好,我是雄雄。 前言 关于jeecg-boot,之前介绍过好多好多次,至于说这是个什么样的技术,这里不在详细介绍,大家可以在gitee或者百度上搜搜,大致了解一下。 因为是个开源的框架,所以一般小项目…

Unity 3D 创建简单的几何模型 || Unity 3D Assets 游戏资源目录管理

Unity 3D 创建简单的几何模型 Unity 3D 是一个强大的游戏开发引擎。在游戏开发中使用的模型常常是从外部导入的,Unity 3D 为了方便游戏开发者快速创建模型,提供了一些简单的几何模型,其中包括立方体、球体、圆柱体、胶囊体等。 自由物体创建…

单测在商家前端业务中的实践

1. 背景 商家系统是提供给得物商家在得物平台上可以稳定运营的服务抓手,前端代码也伴随着系统的发展而不断壮大。这样将导致文档却更新不及时,最后想再通过这些文档回溯业务逻辑也非常困难。 且若代码结构上没有关注,动辄就会产出一个大几千…

LFU 的设计与实现

LFU 的设计与实现 作者:Grey 原文地址: 博客园:LFU 的设计与实现 CSDN:LFU 的设计与实现 题目描述 LFU(least frequently used)。即最不经常使用页置换算法。 题目链接:LeetCode 460. LF…

浅析Linux字符设备驱动程序内核机制

前段时间在学习linux设备驱动的时候,看了陈学松著的《深入Linux设备驱动程序内核机制》一书。说实话,这是一本很好的书,作者不但给出了在设备驱动程序开发过程中的所需要的知识点(如相应的函数和数据结构),…

从零开始的MySQL(2)

目录1.数据库约束1.1 unique1.2 not null1.3 default1.5 primary key1.6 foreign key2. 将A的记录插入到B中3.聚合函数3.1 count()函数3.2 sum()函数3.3 avg()函数3.4 max()函数3.5 MIN()函数3.6 group by4.联合查询4.1 内连接4.2 外连接4.3 自连接4.4 子连接1.数据库约束 约束…

【简单易上手】昇思MindSpore邀你定制专属Diffusion模型

昇思MindSpore首个可训练diffusion模型DDPM马上要和大家见面了,操作简单,可训练推理,单卡即可运行,欢迎广大产学研开发者使用启智社区免费Ascend NPU算力体验 最近爆火的AI绘图,相信大家并不陌生了。 从AI绘图软件生成…

知识图谱的知识表示:向量表示方法

目录 从词向量到实体向量 知识图谱向量表示学习模型 TransE TransH TransR TransD TransX系列总结 DisMult 从词向量到实体向量 知识图谱的向量表示。有一类词是代表实体的,假如对这类实体词的向量做一些计算,比如用Rome向量减去Italy的向量&am…

使用界面组件Telerik ThemeBuilder研发主题,只需要这七步!

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序。 ThemeBuilder是一个web应用程序&#xff0…

前端基础(一)_初识JavaScript

最开始的时候,浏览器只能显示文本和图片,并不能做各种动态的操作。 一、JavaScript的历史 1、网景公司的布兰登艾奇开发了js 2、借鉴了java的数据管理机制、c的函数 3、Js的创建是用来解决浏览器和用户之间互动的问题(表单提交的问题&#…

LeanCloud 快速实现服务端

1. 实现与服务器交互平台 1.1 Google 平台的 Firebase (需要科学网络) Firebasehttps://firebase.google.cn/ 1.2 LeanCloud 平台 LeanCloudhttps://www.leancloud.cn/ 2. 配置信息 2.1 在 LeanCloud 控制台创建应用, 根据 SDK下载 开发指南配置应用 2.2 配置文件 build…

拉伯杠杆平台|新冠药龙头跳水,万亿产业开启新阶段!

依照此前发表的时间表,新修订的《体育法》将于2023年1月1日起正式施行。 12月27日早盘,A股前期大热的抗疫体裁呈现显着回落。熊去氧胆酸、新冠药、肝炎概念、新冠检测、生物疫苗等体裁跌幅较大。熊去氧胆酸、新冠药两大板块跌幅超过4%,抢手龙…

外贸采购管理对业务的影响及解决方案

在外贸企业中,采购环节的把控对整个业务环节都有影响。像是采购供应商是否能够按时到货,会直接影响生产进度;采购质量的好坏直接影响产品的生产进度及质量;采购成本的高低,直接影响产品的成本及利润;采购供…

NSUM 问题

目录标题两数之和两数之和 2(多个结果集去重)15. 三数之和两数之和 问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答…

基于Java(JSP)+MySQL实现(Web)学生成绩综合管理系统【100010065】

Java 课程设计:师生交流系统 1.1 课设题目 信息商务学院学生成绩综合管理系统的综合与开发 2.1 课设目的 《Java 程序设计》课程是计算机专业的一门专业必修课程,针对课程进行为期两周的实践教学,旨在提升本专业学生对此课程中的理论知识的综合应用能…

[Python学习系列] 走进Django框架

文章目录1. 安装django2. 创建项目(命令的方式)在第一次创建django项目需要做的:每一次创建django项目需要做的:3. 创建app4. 启动运行django项目程序5. 模板&静态文件的存放地址6. django中的模板语法7. django中常见的请求和…

ArcGIS基础实验操作100例--实验4矢量要素的镜像复制,缩放

实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验4 矢量要素的镜像复制,缩放 目录 一、实验背景 二、实验数据 三、实验步骤 (1)加载【Mirror Features】工具 &#x…

VMware之安装Windows10系统

系统下载 下载地址:原版软件 (itellyou.cn) 创建虚拟机系统框架 在菜单栏中选择文件下的新建虚拟机 选择自定义,然后点击下一步 直接下一步 选择稍后安装操作系统,然后点击下一步 因为安装的系统是Windows,这里注意选择Microsof…

使用eBPF追踪Linux内核

简介 BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成&…

浏览器:理解HTTP无状态与Cookie的使用

一、理解HTTP无状态 1.1、理解http无状态 http无状态是指协议对于用户身份、用户状态、用户权限、交互场景等没有记忆能力。简单讲就是不能识别用户。 1.2、http无状态的优点: 可以更快地处理大量的事务,确保协议的可伸缩性,减少服务器的…