商城订单超过 30 分钟未支付自动取消订单,最佳解决方案是怎样?

2017-10-13 16:16:37 +08:00
 herozw

如果用定时任务设置一个每秒执行的脚本,那样可能影响服务器性能。

33939 次点击
所在节点    PHP
73 条回复
anewg
2017-10-14 12:12:26 +08:00
@Reign 商品要回库,再也不访问会影响库存
0915240
2017-10-14 13:06:30 +08:00
@Reign #60 那这样我能把你家的库存占用完,订单失效库存要回库啊。
SlipStupig
2017-10-14 14:10:08 +08:00
https://github.com/ouqiang/delay-queue, 完全符合楼主要求...
Reign
2017-10-14 17:31:37 +08:00
@0915240
@anewg 我理解成了给钱才发货
zhx1991
2017-10-14 17:57:39 +08:00
定时任务啊

这种基础组件应该有做一个吧.
abccccabc
2017-10-15 08:50:14 +08:00
@herozw  可以使用 jobcenter 一类的以秒为单位的计划任务。
runningman
2017-10-15 11:15:57 +08:00
@SlipStupig 这个确实符合,但是这个是 go 写的,有 php 写的没,
0915240
2017-10-15 11:20:01 +08:00
@Reign #64 给钱了没货了怎么办,大家都来订单你都说好好好给钱就发货,然后你没那么多货,不就 gg 了。有一个商品下单商品占位的过程。
lishunli
2017-10-15 17:59:00 +08:00
@petelin 延迟队列 + 兜底定时任务,不过需要考虑队列和任务对同一个订单同时取消的问题
Winny
2017-10-16 08:53:49 +08:00
1.订单表增加过期时间字段,用在查询页面展示并在用户试图操作的时候拒绝(同时触发回库逻辑)

2.同时跑一个固定间隔的计划任务,每隔一段时间(根据业务和负载决定),将订单表中的过期记录关闭(避免 1 没有触发导致回库的问题)
mingyun
2018-01-21 11:13:45 +08:00
延迟队列 +1
go_starter
2019-05-07 17:46:22 +08:00
不用轮训的方式如何实现?轮训比较消耗服务器资源,如果订单量不多还好说,电商这种订单很大的情况不会采用轮训的方法的。初步想法是在订单提交后注册一个异步任务,比如 30 分钟后执行。如果订单状态是未支付,就取消订单。如果已支付,啥都不用做。最后删除任务。至于任务的中断、异常、恢复、持久化等,需要任务系统做好服务的 QOS 即可。
huangke
2019-06-03 16:29:44 +08:00
生成订单的时候把订单号存入 Redis 作为 key,按订单有效时间设置失效时间,当监听到键失效的时候就可以执行代码将订单标记为过期,关键词:notify-keyspace-events

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

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

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

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

© 2021 V2EX