订单超时未支付自动关闭的几种实现方案
参考:https://cloud.tencent.com/developer/article/1592068
- 定时任务:定时轮询数据库
缺点:时效性差,会有一定的延迟;效率低;数据库压力大
- 被动取消:客户查看时才取消
缺点:如果用户不进行查询订单的操作,该订单就永远不会被取消。不会取消的订单,也就可能意味着库存可能被占用。
实际方案:可能是被动取消 + 定时任务的这种组合实现方式。 -- 实现简单
- 时间轮:
- 延时消息:RocketMQ
- JDK DelayQueue:可以在此基础上,扩展成一个分布式的,支持集群的延时队列。但是缺点是,难度较高,小公司根本没有这个机会来做。
- Redis(zset):zset是一个有序集合,每一个元素(member)都关联了一个 score,通过 score 排序来取集合中的值。我们将订单超时时间戳与订单号分别设置为 score 和 member。系统扫描第一个元素判断是否超时;在高并发条件下,多消费者可能会取到同一个订单号。不得已而又加来一个分布式锁来处理,造成效率下降。