订单超时未支付自动关闭实现方案

一.场景

        生活中,12306购票、京东、淘宝购物下单,都会遇到请在30分钟内进行支付的场景,互联网电商项目的订单系统都需要解决订单超时问题。

        无独有偶,订单超时业务场景,非常符合“在一段时间之后,完成一个工作任务”的需求。今天,抽时间给大家总结了几种订单超时未支付自动关闭的实现方案。

二.实现方案

1、定时任务

数据库轮询方式,实现思路比较简单。启动一个定时任务,每隔一定时间扫描订单表,物理逻辑做处理,这种处理方式只是适合比较小而简单的项目。

假设订单表结构为:

t_order(订单Id、订单状态status、创建时间utc_time)

然后,定时任务每隔一个5min(自己设定时间)扫描数据库,通过下单时间和状态判断订单是否30分钟还未支付:

select orderId from t_order where 当前时间-utc_time > 30min and status = "未支付";

然后,关闭订单:

update t_order set status = "订单取消" where orderId in(超时订单id);

如果数据量很大,需要分页查询,分页update会是一个for循环。

优点:

        实现简单,无技术难点,异常恢复,支持分布式/集群环境。

缺点:

        影响数据库性能,时效性差,效率低。

2、 被动取消

这种实现方案和懒加载的思想一致,就是被动的取消订单。只有当用户查询订单消息时,再判断订单是否超时,如果超时再进行超时逻辑的处理。但是这种方式依赖于用户的查询操作触发,也就说如果用户不进行订单查询,该订单就永远不会被取消,这就会导致库存可能始终被占用。

所以,在实际项目中,很可能是被动取消 + 定时任务的组合实现方式解决超时订单。这种情况下定时任务的执行时间可以设置稍微“长”一点。

优点:

        实现思路简单。

缺点:

        (1)会产生额外影响,比如统计,订单,库存等;

        (2)影响用户体验,用户打开订单列表可能需要处理大量数据,影响显示的实时性。

3、延迟任务

JDK的延时队列

JDK自带了一个延时队列DelayQueue,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,必须实现Delayed接口。

// 定义一个Delay,放入到DelayQueue队列中,向队列中插入一个元素(延时任务)"以毫秒为单位的延迟"
taskService.addTask(new CancelOrderTask(outTradeNo, 1800000));
public class CancelOrderTask extends Task {

    private final Log logger = LogFactory.getLog(GenerateWalletTask.class);
    private String outTradeNo;

    public CancelOrderTask(String outTradeNo, long delayInMilliseconds) {
        super("CancelOrderTask-" + outTradeNo, delayInMilliseconds);
        this.outTradeNo = outTradeNo;
    }

    // 执行任务
    @Override
    public void run() {
        
        // 如果存在则取消订单,恢复对应库存
       
    }
}
public abstract class Task implements Delayed, Runnable{
    private String id = "";
    private long start = 0;

    public Task(String id, long delayInMilliseconds){
        this.id = id;
        this.start = System.currentTimeMillis() + delayInMilliseconds;
    }

    public String getId() {
        return id;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        long diff = this.start - System.currentTimeMillis();
        return unit.convert(diff, TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        return Ints.saturatedCast(this.start - ((Task) o).start);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null) return false;
        if (!(o instanceof Task)) {
            return false;
        }
        Task t = (Task)o;
        return this.id.equals(t.getId());
    }

    @Override
    public int hashCode() {
        return this.id.hashCode();
    }
}
@Component
public class TaskService {
    private TaskService taskService;
    private DelayQueue<Task> delayQueue = new DelayQueue<Task>();

    @PostConstruct
    private void init() {
        taskService = this;

        Executors.newSingleThreadExecutor().execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Task task = delayQueue.take();
                        task.run();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public void addTask(Task task) {
        if (delayQueue.contains(task)) {
            return;
        }
        delayQueue.add(task);
    }

    public void removeTask(Task task) {
        delayQueue.remove(task);
    }

}

优点:

        实现简单,性能较好。

缺点:

        异常恢复困难,分布式/集群实现困难。

青年人的责任重大!努力吧...

青年人责任
关注 关注
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
场景应用:订单支付超时支付关闭订单的解决方案
流楚丶格念的博客
09-11 6852
综上所述,使用定时任务和数据库触发器的方案在某些场景下可能更具优势,现实中用的最多的是消息队列的方案(死信队列,这里不多叙述,主要提供方案的思路)。然后,在支付超时时间到达之前,如果订单支付,就从消息队列中取出这条订单信息,然后关闭这个订单。如果订单已经超过了指定的支付超时时间,那么我们就将这个订单的状态标记为“已关闭”,并执行关闭订单的操作。在电子商务或在线支付的场景中,当用户下订单并选择支付方式后,如果订单在限定时间内完成支付,就会触发超时支付订单处理流程。
订单超时支付自动取消5种实现方案
m0_73311735的博客
03-02 1360
在开发中,往往会遇到一些关于延时任务的需求。比如最近大家都在忙抢回家的火车票,当你下了一个订单没有支付时,会有一个倒计时,提示你半小时之内支付,否则会自动取消。这样的场景是如何实现的呢?
订单超时支付自动关闭的几种实现方案
xmt1139057136的专栏
10-26 9153
做电商,就会遇到订单超时问题,而且还经常被拿来面试提问!今天,周末放假,抽时间给大家总结了几种订单超时支付自动关闭实现方案。同时,我手机还有几套电商类从零架构到实现的...
订单超时自动取消如何实现
最新发布
weixin_51456741的博客
08-22 425
订单超过15分钟支付自动取消订单,在这个业务场景中,如果是你,你会怎么实现
字节跳动面试热点:订单超时支付自动关闭有几种实现方案
孤芳不自赏
07-20 352
在竞争激烈的职场中,面试是展现自己的绝佳机会。面试题是雇主了解我们技能和潜力的窗口。让我们一起揭开面试题的面纱,探索如何在这个关键时刻展现出最好的自己。
超时放弃订单怎么实现(几种方案
delete_bug的博客
07-11 1606
关于订单过期自动取消的几种方案
Java实现商城订单超时取消功能
08-25
大多数的B2C商城项目都会有限时活动,当用户下单后都会有支付超时时间,当订单超时订单的状态就会自动变成已取消 ,这个功能的实现有很多种方法,本文的实现方法适合大多数比较小的商城使用。具体实现方式可以跟随小编一起看看吧
TP5.1 实现超时支付订单自动关闭
huangdj321的博客
05-20 5350
对于这个需求,我以前写过Laravel版本的。今天想在TP5.1中实现这个功能,但是网上基本没什么教程可供参考,所以写篇文章仅供大家学习。 一、前台 1、先来加载订单确认页面 当下单成功后,通过 js 跳转到订单确认页,在 checkout.html 中: {block name="js"} <script> $(function () { //去付款,就是下单,跳到订单确认页 $("#pay").click(function () {
使用swoole 定时器变更超时支付订单状态的解决方案
01-02
借助 swoole 定时器和 redis 的 zset 来实现的定时检查并过期支付订单 起源于一个需求:将30分钟内支付订单过期处理成已失效状态。 最常规简单的解决方案:在服务器上,跑一个定时任务,去数据表中查询数据,...
springboot结合rabbitmq实现订单超时自动关闭
02-05
springboot结合rabbitmq实现订单超时自动关闭
订单超时支付自动取消8种实现方案
热门推荐
xzh_blog
08-16 1万+
定时轮询、惰性取消、JDK延迟队列、时间轮、Redis过期回调、Redis有序集合、任务调度、消息队列
订单超时自动取消的 3 种解决方案,yyds!
DeveloperFire的博客
02-23 1182
第三种方案,就是利用延时消息了,可以使用RocketMQ、RabbitMQ、Kafka的延时消息,消息发送后,有一定延时才会投递。大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消。我们用的就是这种,消息队列采用的是RocketMQ,其实RocketMQ延时也是利用定时任务实现的。使用延时消息的优点是比较高效、好扩展,缺点是引入了新的技术组件,增加了复杂度。对数据库的压力很大,定时任务造成人为的波峰,执行的时刻数据库的压力会陡增。
订单超时自动取消的技术方案解析及代码实现
2301_78834737的博客
07-18 1079
订单超时自动取消是电商平台中常见的功能之一,例如在淘宝、京东、拼多多等商城下单后,如果在一定的时间内没有付款,那么订单自动被取消,是怎么做到的呢?作为技术人员我们应该了解自动取消的原理和实现逻辑,本文将介绍几种常用的技术方案,帮助开发者实现订单超时自动取消的功能。通过以上图我们可以看到其实超时自动取消的方案有很多,虽然方案多(大多数都是结合延迟队列来实现的),但每个方案都有自己的优缺点,具体场景需要选用合适的方案。本文我们主要讲解以下几种常用取消方案,其他方案可自行搜索研究。
实现一定时间支付自动取消订单的5种方案
m0_73980188的博客
05-13 2238
在开发中,往往会遇到一些关于延时任务的需求。例如:生成订单 15 分钟支付,则自动取消;生成订单 60 秒后,给用户发短信;对上述的任务,我们给一个专业的名字来形容,那就是**延时任务**。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别:- 定时任务有明确的触发时间,延时任务没有。- 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务。
订单超时自动关闭方案
2301_78976656的博客
07-08 950
项目应将可靠性、可维护性放在首位,尤其是对于小项目或刚起步的项目,数据库轮询或redis轮询完全足够了,没必要为一个超时功能,额外引入消息队列这么重的中间件,过度设计徒增成本。即使采用了redis或消息队列等方案,也最好保留数据库轮询方案,作为异常情况的兜底。
订单超时自动取消3种方案
悟已往之不谏,知来者之可追
04-06 1936
1.定时任务 2.被动取消 3.延时消息
商城系统订单超时自动取消解决方案
小坚的技术博客
12-17 3020
功能说明 用户下单后 30 分钟如果没付款自动取消掉,然后释放库存,下面简单介绍订单超时自动取消的几种常用的方案。 1.定时轮询 最简单的方法,写好取消订单的逻辑,一般是取订单表待付款状态的订单,然后做遍历取消处理,使用Linux系统的crontab定时执行取消订单功能。 优点:简单快捷,业务小的可以考虑 缺点: 由于Linux的限制,只能精确到秒 轮询频率不能自主控制,如果运维和开发分开管理,每次调整需要运维配置修改 如果第一次轮询耗时长,第二次轮询又开始了,会造成任务重复执行 占用数据库资源 不能并发
JAVA 用rabbitMQ解决订单超时支付的流程
06-10
在使用 RabbitMQ 解决订单超时支付的流程中,可以考虑以下步骤: 1. 创建交换机和队列:在 RabbitMQ 中创建交换机和队列,用于接收订单超时的消息。 2. 发送消息:在订单创建时,向 RabbitMQ 发送消息,包括订单信息和超时时间等信息。 3. 消费消息:消费者从队列中获取消息,并进行处理。如果订单超时支付,将订单状态设置为超时支付,并取消订单。 4. 定时器:使用定时器监控订单状态,如果订单在规定时间内支付,向 RabbitMQ 发送超时消息。 5. 监听器:在 RabbitMQ 中监听超时消息,如果有订单超时支付,将订单状态设置为超时支付,并取消订单。 通过 RabbitMQ 解决订单超时支付的流程,可以实现异步处理,提高系统的可靠性和稳定性,减少订单处理的延迟和错误。同时,还可以根据实际情况调整消息的发送频率和超时时间,以满足不同场景下的需求。
写文章

热门文章

  • Java八大基本数据类型 51337
  • Web3j签名与验签 17573
  • 以太坊合约地址的生成方式 12152
  • Java实现AES加密算法 9510
  • VO、BO、PO、DO、DTO的区别 6186

最新评论

  • Web3j签名与验签

    2401_86093681: 没有看不懂咋办生气卸载了怎样才能看得到我的原力币和芯片

  • Java实现IPFS文件的上传和下载

    半音符: 我的依赖也下载不了,请问你解决了吗

  • SpringBoot实现本地文件存储及预览

    意难平759: 你好,请问第四部分的java code写在哪个文件里呀

  • Web3j签名与验签

    FreeWAaaa: 能请问下import都是什么呢 包

  • SpringBoot实现本地文件存储及预览

    明星凰凰: yml里加了自定义路径, 返回的文件能访问到, 但是http还是404[code=plain] { "localPath": "E:/Project/logs/盎.png", "URL": "http://127.0.0.1:2528/盎.png" } [/code]

大家在看

  • 基于深度学习的机器人智能控制算法 仿真环境1 323
  • 这类可视化大屏前端实现起来绝对没问题,来给设计师打个样
  • 前端学习笔记之CSS
  • GRPC 压缩算法 638
  • 洛谷 P1226:【模板】快速幂

最新文章

  • PO、VO、BO、DAO、DTO、POJO的区别(二)
  • spring boot读取yml配置
  • SpringBoot自动配置原理和实践
2023年1篇
2022年25篇
2021年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家高邮玻璃钢浮雕人物山水雕塑廊坊玻璃钢龙虾雕塑厂家供应江苏中庭商场美陈哪里有玻璃钢小品雕塑厂玻璃钢雕塑怎么恢复长沙玻璃钢雕塑出租异形玻璃钢雕塑日照动物玻璃钢雕塑安装祖庙校园玻璃钢人物雕塑大兴安岭玻璃钢商场美陈拉萨电镀玻璃钢雕塑定做嘉峪关人物玻璃钢雕塑邯郸玻璃钢艺术雕塑芒市玻璃钢雕塑报价特色玻璃钢花盆价格主题玻璃钢卡通雕塑货源充足彩绘玻璃钢雕塑工厂海口商场美陈询问报价福建主题商场美陈有哪些浙江季节性商场美陈价格汕头玻璃钢字母座椅雕塑永川玻璃钢人物雕塑徐州主题商场美陈砂岩花盆玻璃钢花盆灵寿玻璃钢雕塑蚌埠户外玻璃钢雕塑优势西藏玻璃钢景观雕塑玻璃钢吉祥物卡通雕塑价格四川动物玻璃钢雕塑销售厂家贵州玻璃钢孔子雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化