当前位置: 首页 > news >正文

我们用过的 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过期监听……

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

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

http://www.jsqmd.com/news/362958/

相关文章:

  • Bootstrap 弹出框
  • 看看如何用 Redis实现微博好友(关注,取关,共同关注)
  • 2026年名包回收正规平台厂家最新推荐:百达翡丽名表回收电话、迪奥名包回收电话、香奈儿包包回收电话选择指南 - 优质品牌商家
  • 2/9
  • Spring Boot 3 步完成日志脱敏,简单实用~
  • 在windows7安装高版本Nodejs
  • 2026清水混凝土塑料模板优质推荐榜 - 优质品牌商家
  • 微信小程序 基于SpringBoot3的校园食堂点餐配送系统的设计与实现
  • Java毕设选题推荐:基于springboot的软件协作跟踪平台的设计与开发基于springboot的软件开发项目任务跟踪系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • ESP32简单介绍(包含与STM32、C51之间的联系) - 指南
  • 基于SSM框架城市生活e家平台 社区物业服务系统
  • 【课程设计/毕业设计】基于springboot的软件协作跟踪平台的设计与开发软件项目进度管理系统【附源码、数据库、万字文档】
  • 伺服系统三环控制这玩意儿就像给机器人装了个智能驾驶系统。今天咱们来聊聊怎么用现代控制算法让它跑得又稳又快,重点看看位置速度环复合控制这个核心玩法
  • 【程序员职业规划】没有实习经历,简历该怎么写?
  • Java计算机毕设之基于Java springboot软件协作跟踪平台系统项目申请进度变更基于springboot的软件协作跟踪平台的设计与开发(完整前后端代码+说明文档+LW,调试定制等)
  • 基于SSM框架的校园编程俱乐部管理系统的设计与实现
  • Agent Skills 检索全攻略(非常详细),颠覆你对传统 RAG 的认知!
  • 基于springboot的小说在线阅读平台 数据可视化 章节
  • 互联网大厂Java求职面试实战:Spring Boot微服务与消息队列在电商场景中的应用
  • 2026年名表回收公司权威推荐:卡地亚名表回收电话/名牌包回收电话/成都二手名包回收电话/成都名包上门回收电话/选择指南 - 优质品牌商家
  • 什么是裸金属服务器(Bare Metal Server)?
  • 谁说Win7安装不了Node.js最新版的呢?都2025年,还不更新系统到Win11
  • 大模型实战项目精选(非常详细),8个超硬核案例,收藏这一篇就够了!
  • 2026年入坑IT行业,程序员的编程语言如何正确选择!才能让自己立于不败之地?
  • 让Oracle 回收站,定时释放表空间,释放drop表(BIN$QVpggWU0FYfgYwsLbgrhcA==$0)空间
  • 2026年名包回收厂家权威推荐榜:成都品牌名表回收电话/成都奢侈品名表回收电话/成都高价奢侈品包包回收电话/选择指南 - 优质品牌商家
  • java juc 01 进程与线程
  • 2026最新Vue经典面试题总结(含答案)
  • 基于springboot的服务商后台管理系统设计 项目申报
  • Agent Skills 从入门到精通(非常详细),收藏这一篇就够了!