最近搭建了个个人博客地址,感兴趣的小伙伴可以前往超级传送门
超时关闭订单
业务场景:
最近工作中遇到了一个业务场景:用户在一定时间后没有支付订单的话,就会关闭订单
经过查阅资料,当前主要有以下几种方式来实现
- 不关闭,一直到用户查询时再关闭订单
- 定时任务关闭订单
- 利用延时队列(MQ/Redis之类的)
当前的实现方式:
利用定时任务(XXL-JOB)+延时队列实现(ONS)
之所以选择XXL-JOB和ONS,是由于公司的框架使用到了这两种。另外还试验了下Redis的延迟队列,在此不作过多的阐述,感兴趣的小伙伴可以和我私下交流!
定时任务:作为一个保底的方案,当MQ出现异常时,定时任务还能够保证订单最终还是能够被关闭(该任务具有一定的时间误差)
MQ:具有实时性保证,一旦订单超时,就能够立刻处理并关闭订单
设计思路:
-
数据库表设计(仅展示关键字段)
Name Type Length Comment order_code varchar 50 订单号 status tinyint 4 订单状态 pay_timeout datetime 支付超时时间 -
定时任务:
查找所有超时时间早于当前时间并处于支付中的订单并关闭订单
-
延时队列
- 用户创建订单时,根据配置的超时时长,往消息队列中推送一条消息
- 处理超时的任务订阅这条队列,处理超时的消息
遇到的一些特殊情况:
- 描述:前端页面上有一个订单支付的倒计时,倒计时结束时回去查询订单的最新状态,并将查询到的结果展示在页面上。而前端查询订单状态的线程与消息队列处理超时订单的线程几乎是同时进行的。难以保证先后顺序,这样前端页面上查询出来的订单信息可能仍然为支付中的状态
- 目前的解决思路:(两种思路殊途同归,本质是一样的:前端查询订单状态的线程执行顺序在消息队列处理超时订单的线程之后)
- 订单的延时队列,延时的时间设置比真正的时间短一些(1s)
- 前端的倒计时时间增长一些(1s)
网友评论