有一个有关订单自动取消的问题,请大家指教一下

2017-11-20 09:48:43 +08:00
 zhangwugui

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

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

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

想法:目前在领导的提醒下,想到了用消息来处理,下完单后延时 30 分钟发送消息来处理,不知还有没有其他的处理方式,多谢大家,请多多指教。

9219 次点击
所在节点    程序员
51 条回复
misaka19000
2017-11-20 09:55:10 +08:00
为什么在分布式环境中就会重复执行呢?
Doodlister
2017-11-20 09:58:10 +08:00
记录下单时间 。在用户访问订单的时候用超时时间和下单时间比较如果超时就取消订单。
th00000
2017-11-20 10:01:53 +08:00
让用户自己触发会好一点吧
xman99
2017-11-20 10:02:53 +08:00
@Doodlister #2 超过时间还是可以支付的, 除非你在 支付宝或者微信平台关闭这个订单
zhangwugui
2017-11-20 10:10:22 +08:00
@Doodlister 如果用户不访问,那他的订单列表里有将一直有这个待支付的订单喽。
gone
2017-11-20 10:15:09 +08:00
cron 脚本就可以,即便是集群环境下 数据库肯定是唯一把 ,检查当前时间之前的正常状态订单,改掉状态.
YORYOR
2017-11-20 10:15:43 +08:00
做好幂等处理,这个跟怎么实现没关系吧
Felldeadbird
2017-11-20 10:22:39 +08:00
cron 脚本去检查 + 用户访问触发 。
xinyewdz
2017-11-20 10:23:31 +08:00
消息分桶处理。每分钟只消费对应桶的消息即可,不必全表扫描。
Jakesoft
2017-11-20 10:28:05 +08:00
每次生成一个但支付订单时,
同时向 redis setnx 设定该未支付订单,
每次查询一个待支付订单时须从 redis 中也查一遍,
如果 redis 不存在该订单,
则将该订单的(数据库)状态改为已取消。
freelee
2017-11-20 10:37:18 +08:00
如果是 java,可以用 elastic-job,一个分布式定时任务框架
gcli
2017-11-20 10:39:28 +08:00
推荐延时队列。
可以 rabbitmq 实现的。AB 两个队列,A 队列设置消息过期时间,A 队列没有消费者,A 队列过期后自动转发到 B 队列,B 队列消费者进行取消队列。
gcli
2017-11-20 10:39:58 +08:00
推荐延时队列。
可以 rabbitmq 实现的。AB 两个队列,A 队列设置消息过期时间,A 队列没有消费者,A 队列过期后自动转发到 B 队列,B 队列消费者进行取消订单操作。
gcli
2017-11-20 10:40:29 +08:00
yuankui
2017-11-20 10:50:45 +08:00
你当前的方案问题是,机器一挂,消息就得丢,然后你就要扫描数据,修数据.

标准做法就是楼上说的延时队列, 可以谷歌下.
如果要自己实现,切记一定要是分布式的.
paragon
2017-11-20 10:59:04 +08:00
@Doodlister 主要应该是退库存操作吧
openbsd
2017-11-20 11:05:26 +08:00
大并发情况下,定时任务会不会产生过大的系统开销 ?
用户触发开销会稍微小点吧
用户 再次? 请求订单列表时 做个核对,时间超过 30 分钟直接自动取消,简单粗暴
openbsd
2017-11-20 11:06:22 +08:00
@paragon 没付款就减库存 ?不符合某宝的 抢单风格啊......
shawn7
2017-11-20 11:08:28 +08:00
DelayQueue?
picone
2017-11-20 11:54:21 +08:00
延时队列+1
就算是分布式 消费者很多个也只有一个拿到

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/407801

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX