news 2026/4/1 22:43:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我们用过的 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过期监听……

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 19:09:49

Spring AI Embedding 全解析:从语义搜索到企业级客服知识库

Spring AI Embedding 全解析:从语义搜索到企业级客服知识库 本文是一篇从原理 → 实战 → 企业级治理的完整技术指南,系统讲解如何基于 Spring AI Embedding 构建一个可控、可扩展、可运营的企业级客服知识库。 一、什么是 Embedding?为什么它是语义智能的基础 在 Spring A…

作者头像 李华
网站建设 2026/4/1 18:39:10

基于SpringBoot3和Vue.js的宠物领养救助系统

目录系统概述核心功能技术亮点社会价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统概述 基于SpringBoot 3和Vue.js的宠物领养救助系统是一个现代化的Web应用,旨在通过技术手段解决流浪…

作者头像 李华
网站建设 2026/4/1 19:43:33

计算机Java毕设实战-基于springboot的影院购票系统的设计与开发基于Springboot框架的影院购票系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/31 14:30:13

题目1454:蓝桥杯历届试题-蚂蚁感冒

很有意思的一道题&#xff0c;需要画图&#xff0c;画出来就明白了#include<iostream> #include<cmath> using namespace std; int main(){int n;cin>>n;int a[100];int count1;for(int i0;i<n;i){cin>>a[i];}for(int i1;i<n;i){//感染源向左 if…

作者头像 李华
网站建设 2026/3/31 3:27:24

优化大数据批处理的网络传输效率

大数据批处理网络传输优化实战&#xff1a;从“卡脖子”到“飞起来”的5个关键技巧 标题选项 《大数据批处理网络优化指南&#xff1a;解决传输慢的5个可落地技巧》《搞定大数据传输瓶颈&#xff01;批处理场景下的网络效率提升实战》《大数据工程师必看&#xff1a;让批处理任…

作者头像 李华
网站建设 2026/3/29 6:03:18

基于C#实现逐点插入法生成Delaunay三角网

一、核心算法实现&#xff08;DelaunayTriangulator.cs&#xff09; using System; using System.Collections.Generic; using UnityEngine;public class DelaunayTriangulator {public struct Triangle{public Vector2 A, B, C;public Vector2 CircumCenter;public float Circ…

作者头像 李华