订单超时自动取消3种方案——我们用这种!
大家好,大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消。
今天,我们来聊聊订单超时未支付自动取消的几种方案。
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种方案——我们用这种!相关推荐
- delayQueue实现订单超时自动取消
目录 说明 实现 1.编写Delayed实现类 2.编写DelayQueue业务类 3.编写订单业务逻辑 总结说明 说明 商城系统的订单模块都应该有:订单未支付超时后自动取消订单的操作.我们在开发过程 ...
- 使用DelayQueue模拟订单超时自动取消
1.创建能在DelayQueue中存放的Order对象 package com.example.javastudy.delay_queue;import java.time.Duration; imp ...
- 订单超时未支付自动取消5种实现方案
大家好,我是宝哥! 前言 在开发中,往往会遇到一些关于延时任务的需求.比如最近大家都在忙抢回家的火车票,当你下了一个订单没有支付时,会有一个倒计时,提示你半小时之内支付,否则会自动取消.这样的场景是如 ...
- 订单过期 自动取消实现方案
在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢 ...
- Java 实现订单未支付超时自动取消
在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动.比如在京东下单为完成支付: 超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能. ...
- TP6订单待支付超时自动取消
1:安装redis 2:安装think-queue composer require topthink/think-queue 3:设置配置文件,使用redis进行存储,文件位置config/queu ...
- 拼夕夕订单超时未支付自动关闭实现方案!
" 在开发中,往往会遇到一些关于延时任务的需求.例如:生成订单 30 分钟未支付,则自动取消:生成订单 60 秒后,给用户发短信. 对上述的任务,我们给一个专业的名字来形容,那就是延时任务. ...
- 订单超时未支付自动取消8种实现方案
定时轮询 数据库定时轮询方式,实现思路比较简单.启动一个定时任务,每隔一定时间扫描订单表,查询到超时订单就取消. 优点:实现简单. 缺点:轮询时间间隔不好确定,占用服务器资源,影响数据库性能. 惰性取 ...
- java订单到期自动取消_订单自动过期实现方案
需求分析: 24小时内未支付的订单过期失效. 解决方案 被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列 ...
最新文章
- java考勤与工资管理系统
- 04、Vue.js---自定义过滤器
- DOS介绍以及常用命令
- Httpster –世界各地最潮的网页设计案例聚合网站
- TC的文件拷贝/移动
- 农民约翰是一个惊人的会计_我的朋友约翰在CSS Grid中犯了一个错误。 不要像约翰-这样做。
- 前端学习(932):mouseenter和mouseover区别
- 机器人码垛手持式编程_FANUC机器人码垛编程讲解
- 关联规则java apriori_关联规则算法(The Apriori algorithm)详解
- 为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?
- 用localStorage来存储数据的一些经验
- 四时之诗:蒙曼品美唐诗读后感
- 系统崩溃怎么重装系统Win10?
- amd支持服务器内存,amd专用内存和普通的内存有什么区别?
- 机器学习相关职位走向
- 二进制和十进制的相互转换
- 重磅!腾讯优图20篇论文入选CVPR 2021
- 化痰止咳平喘药题库【1】
- 深度学习目标检测在游戏领域的应用
- 计算机网络机房需要气体灭火吗,哪些场所需要设置气体灭火系统?