大家好,大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消。

下单

今天,我们来聊聊订单超时未支付自动取消的几种方案。

1.定时任务

这是最容易想到的办法,定时任务去轮询数据库,取消即将超时的订单。

订单轮询

定时任务实现方式有很多种,大概可以分为两类:本地定时任务分布式定时任务

定时任务实现

本地定时任务,适用于单机版的业务系统,实现方式非常多样:

  • 永动机线程:开启一个线程,通过sleep去完成定时,一些开源中间件的某些定时任务是通过这种方式实现的。

  • JDK Timer:JDK提供了Timer API,也提供了很多周期性的方法。

  • 延迟线程池:JDK还提供了延迟线程池ScheduledExecutorService,API和Timer类似。

  • Spring Task:Sprig框架也提供了一些定时任务的实现,使用起来更加简单。

  • Quartz:Quartz框架更进一步,提供了可以动态配置的线程池。

分布式定时任务:适用于分布式的业务系统,主要的实现框架有两种:

  • xxl-job:大众点评的许雪里开源的,一款基于MySQL的轻量级分布式定时任务框架。

  • elastic-job:当当开发的弹性分布式任务调度系统,功能很强大,相对重一些。

定时任务实现的优点是开发起来比较简单,但是它也有一些缺点:

  • 对数据库的压力很大,定时任务造成人为的波峰,执行的时刻数据库的压力会陡增

  • 计时不准,定时任务做不到非常精确的时间控制,比如半小时订单过期,但是定时任务很难卡准这个点

2.被动取消

在文章开头的那个倒计时器,大家觉得是怎么做的呢?一般是客户端计时+服务端检查。

什么意思呢?就是这个倒计时由客户端去做,但是客户端定时去服务端检查,修正倒计时的时间。

那么,这个订单超时自动取消,也可以由客户端去做:

  • 用户留在收银台的时候,客户端倒计时+主动查询订单状态,服务端每次都去检查一下订单是否超时、剩余时间

  • 用户每次进入订单相关的页面,查询订单的时候,服务端也检查一下订单是否超时

被动取消

这种方式实现起来也比较简单,但是它也有缺点:

  • 依赖客户端,如果客户端不发起请求,订单可能永远没法过期,一直占用库存

当然,也可以被动取消+定时任务,通过定时任务去做兜底的操作。

3.延时消息

第三种方案,就是利用延时消息了,可以使用RocketMQ、RabbitMQ、Kafka的延时消息,消息发送后,有一定延时才会投递。

延时消息

我们用的就是这种,消息队列采用的是RocketMQ,其实RocketMQ延时也是利用定时任务实现的。

使用延时消息的优点是比较高效、好扩展,缺点是引入了新的技术组件,增加了复杂度。


除了上面的三种,其实还有一些其它的方式,例如本地延迟队列、时间轮算法、Redis过期监听……

但是我觉得,应该不会有人真考虑过在生产上使用这些方法。

这里再给大家提个小问题,假如我们接入了一种支付方式,支付的周期非常长,我们需要延长订单的有效时间,这种情况下,大家会怎么实现订单超时未支付自动取消呢?


参考:

[1].Java中定时任务的6种实现方式,你知道几种?:https://juejin.cn/post/6992719702032121864

[2].订单超时未支付自动取消8种实现方案:https://blog.csdn.net/Anenan/article/details/126368753:

订单超时自动取消3种方案——我们用这种!相关推荐

  1. delayQueue实现订单超时自动取消

    目录 说明 实现 1.编写Delayed实现类 2.编写DelayQueue业务类 3.编写订单业务逻辑 总结说明 说明 商城系统的订单模块都应该有:订单未支付超时后自动取消订单的操作.我们在开发过程 ...

  2. 使用DelayQueue模拟订单超时自动取消

    1.创建能在DelayQueue中存放的Order对象 package com.example.javastudy.delay_queue;import java.time.Duration; imp ...

  3. 订单超时未支付自动取消5种实现方案

    大家好,我是宝哥! 前言 在开发中,往往会遇到一些关于延时任务的需求.比如最近大家都在忙抢回家的火车票,当你下了一个订单没有支付时,会有一个倒计时,提示你半小时之内支付,否则会自动取消.这样的场景是如 ...

  4. 订单过期 自动取消实现方案

    在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢 ...

  5. Java 实现订单未支付超时自动取消

    在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动.比如在京东下单为完成支付: 超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能. ...

  6. TP6订单待支付超时自动取消

    1:安装redis 2:安装think-queue composer require topthink/think-queue 3:设置配置文件,使用redis进行存储,文件位置config/queu ...

  7. 拼夕夕订单超时未支付自动关闭实现方案!

    " 在开发中,往往会遇到一些关于延时任务的需求.例如:生成订单 30 分钟未支付,则自动取消:生成订单 60 秒后,给用户发短信. 对上述的任务,我们给一个专业的名字来形容,那就是延时任务. ...

  8. 订单超时未支付自动取消8种实现方案

    定时轮询 数据库定时轮询方式,实现思路比较简单.启动一个定时任务,每隔一定时间扫描订单表,查询到超时订单就取消. 优点:实现简单. 缺点:轮询时间间隔不好确定,占用服务器资源,影响数据库性能. 惰性取 ...

  9. java订单到期自动取消_订单自动过期实现方案

    需求分析: 24小时内未支付的订单过期失效. 解决方案 被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列 ...

最新文章

  1. java考勤与工资管理系统
  2. 04、Vue.js---自定义过滤器
  3. DOS介绍以及常用命令
  4. Httpster –世界各地最潮的网页设计案例聚合网站
  5. TC的文件拷贝/移动
  6. 农民约翰是一个惊人的会计_我的朋友约翰在CSS Grid中犯了一个错误。 不要像约翰-这样做。
  7. 前端学习(932):mouseenter和mouseover区别
  8. 机器人码垛手持式编程_FANUC机器人码垛编程讲解
  9. 关联规则java apriori_关联规则算法(The Apriori algorithm)详解
  10. 为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?
  11. 用localStorage来存储数据的一些经验
  12. 四时之诗:蒙曼品美唐诗读后感
  13. 系统崩溃怎么重装系统Win10?
  14. amd支持服务器内存,amd专用内存和普通的内存有什么区别?
  15. 机器学习相关职位走向
  16. 二进制和十进制的相互转换
  17. 重磅!腾讯优图20篇论文入选CVPR 2021
  18. 化痰止咳平喘药题库【1】
  19. 深度学习目标检测在游戏领域的应用
  20. 计算机网络机房需要气体灭火吗,哪些场所需要设置气体灭火系统?

热门文章

  1. Android IMEI和MEID获取问题记录
  2. Rational Rose神器 (画图)
  3. 手把手教你搭建国产嵌入式模拟器SkyEye开发环境
  4. 解密QQ号(stl库)
  5. 听说你们好奇我技术文章里的动图是怎么做的 ?
  6. 初识Vulkan渲染管线
  7. 连打印机时网络里面没有计算机,打印机显示打印系统没有连接到计算机怎么回事...
  8. cad快速选择命令快捷键_CAD快捷键命令:倒角的使用技巧
  9. 微信小程序:王者战力查询改名工具箱小程序源码
  10. 怎样使用GPT案例:使用GPT获得OPPO终止ZEKU芯片业务需要的背景知识