订单超时自动取消策略/延时任务问题
打个广告
我的架构设计专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybvLm
我的java八股专栏:https://www.nowcoder.com/creation/manager/columnDetail/j8ZZk0
八股专栏内有详细苍穹外卖话术哦!
欢迎大家订阅!
前言
在开发中,往往会遇到一些关于延时任务的需求。
例如
- 生成订单30分钟未支付,则自动取消
- 生成订单60秒后,给用户发短信
对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别
定时任务有明确的触发时间,延时任务没有
定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期
定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务
1.数据库定时轮询
定时任务去轮询数据库,取消即将超时的订单。
定时任务实现方式有很多种,大概可以分为两类:本地定时任务
和分布式定时任务
本地定时任务,适用于单机版的业务系统,实现方式非常多样:
- 永动机线程:开启一个线程,通过sleep去完成定时,一些开源中间件的某些定时任务是通过这种方式实现的。
- JDK Timer:JDK提供了Timer API,也提供了很多周期性的方法。
- 延迟线程池:JDK还提供了延迟线程池ScheduledExecutorService,API和Timer类似。
- Spring Task:Sprig框架也提供了一些定时任务的实现,使用起来更加简单。
- Quartz:Quartz框架更进一步,提供了可以动态配置的线程池。
分布式定时任务:适用于分布式的业务系统,主要的实现框架有两种:
- xxl-job:大众点评的许雪里开源的,一款基于MySQL的轻量级分布式定时任务框架。
- elastic-job:当当开发的弹性分布式任务调度系统,功能很强大,相对重一些。
大概思路
思路如下:
- 生成订单时,记录预计的过期时间(
expire_time = now() + 30min
) ,和state一起加上索引,3s轮询数据库,查出超时未付款的订单id - 通过定时器(如xxl-job)去轮询数据库,比如3s一次,查询超时未付款的订单id
select id from order where state = '未付款' and now() >= expire_time l
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏价格永远为19.9元! 不想当架构师的后端开发工程师不是好码农! 此专栏一方面用于存放我的架构设计学习笔记, 另外我会在本专栏加入一系列最常问八股问题帖子,内容就是我根据自己的面试经历和网上的面经,去筛选八股里面哪些是最常被问到的问题把它们整理出来,大家可以在面试前一两个小时快速把这一系列最常问八股的帖子拿出来看看,临时抱佛脚的效果应该很好