大家好,我是苏三,大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消。
下单今天,我们来聊聊订单超时未支付自动取消的几种方案。
这是最容易想到的办法,定时任务去轮询数据库,取消即将超时的订单。
订单轮询定时任务实现方式有很多种,大概可以分为两类:本地定时任务
和分布式定时任务
。
本地定时任务,适用于单机版的业务系统,实现方式非常多样:
分布式定时任务:适用于分布式的业务系统,主要的实现框架有两种:
定时任务实现的优点是开发起来比较简单,但是它也有一些缺点:
在文章开头的那个倒计时器,大家觉得是怎么做的呢?一般是客户端计时+服务端检查。
什么意思呢?就是这个倒计时由客户端去做,但是客户端定时去服务端检查,修正倒计时的时间。
那么,这个订单超时自动取消,也可以由客户端去做:
这种方式实现起来也比较简单,但是它也有缺点:
当然,也可以被动取消
+定时任务
,通过定时任务去做兜底的操作。
第三种方案,就是利用延时消息了,可以使用RocketMQ、RabbitMQ、Kafka的延时消息,消息发送后,有一定延时才会投递。
延时消息我们用的就是这种,消息队列采用的是RocketMQ,其实RocketMQ延时也是利用定时任务实现的。
使用延时消息的优点是比较高效、好扩展,缺点是引入了新的技术组件,增加了复杂度。
除了上面的三种,其实还有一些其它的方式,例如本地延迟队列、时间轮算法、Redis过期监听……
但是我觉得,应该不会有人真考虑过在生产上使用这些方法。
这里再给大家提个小问题,假如我们接入了一种支付方式,支付的周期非常长,我们需要延长订单的有效时间,这种情况下,大家会怎么实现订单超时未支付自动取消呢?
参考:
[1].Java中定时任务的6种实现方式,你知道几种?:https://juejin.cn/post/6992719702032121864[2].订单超时未支付自动取消8种实现方案:https://blog.csdn.net/Anenan/article/details/126368753:最近苏三的知识星球【Java突击队】,每天都会更新很多干货内容。
很多独家的干货内容,比如:Java后端学习路线,分享实战项目,源码分析,百万级系统设计,系统上线的一些坑,MQ专题,真实面试题,每天都会回答大家提出的问题。
这几天星球开通了3个优质专栏:痛点问题、高频面试题 和 性能优化。
每一个专栏都是大家非常关心,和非常有价值的话题,我相信在专栏中你会学到很多东西,值回票价。
券后只需84元,随着干货内容越来越多,而且苏三的demo项目要上线了,价值越来越大。
过几天还会涨价,目前这批优惠券仅剩十几张,要上车的抓紧时间。