订单支付遇到的问题

问题描述

前提:是这样的,一笔订单下单之后,如果不支付,会处于待支付状态。而一般这个订单会有类似 30 分钟不支付自动取消订单的功能。

实现:这种功能的实现,可以通过定时任务,每隔 30 秒或一分钟扫描一次。但如果集群环境下,可能定时任务会执行重复。当然我们可以通过类似操作系统 PV 操作限制同一时段只能一个定时任务执行。

目标:这种情况,除了定时任务,还有没有其他好点的实现?

解决办法

1.记录下单时间 。在用户访问订单的时候用超时时间和下单时间比较,如果超时就取消订单,用户主动触发。在加上定时任务,扫描表,过期订单改为取消状态。
优点:方法简单高效
缺点:用户自己触发的这种并不能即使恢复库存.
2.利用redis。将订单存入redis中,给订单设置过期时间(expire )。支付时,去redis查询订单,不存在的话讲订单设置为已取消。

3.延时队列。 可以 rabbitmq 实现的。AB 两个队列,A 队列设置消息过期时间,A 队列没有消费者,A 队列过期后自动转发到 B 队列,B 队列消费者进行取消队列。(此处是别人给的方案,对消息队列熟悉,等有时间研究)