我们用过的 3种订单超时自动取消方案

📅 发布时间:2026/7/7 19:13:47 👁️ 浏览次数:
我们用过的 3种订单超时自动取消方案
大家对电商购物应该都比较熟悉了我们应该注意到在下单之后通常会有一个倒计时如果超过支付时间订单就会被自动取消。下单今天我们来聊聊订单超时未支付自动取消的几种方案。1.定时任务这是最容易想到的办法定时任务去轮询数据库取消即将超时的订单。订单轮询定时任务实现方式有很多种大概可以分为两类本地定时任务和分布式定时任务。定时任务实现本地定时任务适用于单机版的业务系统实现方式非常多样永动机线程开启一个线程通过sleep去完成定时一些开源中间件的某些定时任务是通过这种方式实现的。JDK TimerJDK提供了Timer API也提供了很多周期性的方法。延迟线程池JDK还提供了延迟线程池ScheduledExecutorServiceAPI和Timer类似。Spring TaskSprig框架也提供了一些定时任务的实现使用起来更加简单。QuartzQuartz框架更进一步提供了可以动态配置的线程池。分布式定时任务适用于分布式的业务系统主要的实现框架有两种xxl-job大众点评的许雪里开源的一款基于MySQL的轻量级分布式定时任务框架。elastic-job当当开发的弹性分布式任务调度系统功能很强大相对重一些。定时任务实现的优点是开发起来比较简单但是它也有一些缺点对数据库的压力很大定时任务造成人为的波峰执行的时刻数据库的压力会陡增计时不准定时任务做不到非常精确的时间控制比如半小时订单过期但是定时任务很难卡准这个点2.被动取消在文章开头的那个倒计时器大家觉得是怎么做的呢一般是客户端计时服务端检查。什么意思呢就是这个倒计时由客户端去做但是客户端定时去服务端检查修正倒计时的时间。那么这个订单超时自动取消也可以由客户端去做用户留在收银台的时候客户端倒计时主动查询订单状态服务端每次都去检查一下订单是否超时、剩余时间用户每次进入订单相关的页面查询订单的时候服务端也检查一下订单是否超时被动取消这种方式实现起来也比较简单但是它也有缺点依赖客户端如果客户端不发起请求订单可能永远没法过期一直占用库存当然也可以被动取消定时任务通过定时任务去做兜底的操作。3.延时消息第三种方案就是利用延时消息了可以使用RocketMQ、RabbitMQ、Kafka的延时消息消息发送后有一定延时才会投递。延时消息我们用的就是这种消息队列采用的是RocketMQ其实RocketMQ延时也是利用定时任务实现的。使用延时消息的优点是比较高效、好扩展缺点是引入了新的技术组件增加了复杂度。除了上面的三种其实还有一些其它的方式例如本地延迟队列、时间轮算法、Redis过期监听……但是我觉得应该不会有人真考虑过在生产上使用这些方法。这里再给大家提个小问题假如我们接入了一种支付方式支付的周期非常长我们需要延长订单的有效时间这种情况下大家会怎么实现订单超时未支付自动取消呢