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

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

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

33571 次点击
所在节点    PHP
73 条回复
lepig
2017-10-13 16:49:15 +08:00
@zhea55 +1
imn1
2017-10-13 16:49:50 +08:00
如果不需要推送通知的话,有必要搞定时器么?
判定时间状态不允许操作就是了
zhea55
2017-10-13 16:52:31 +08:00
Redis 里面有个 expire 的功能,时间到期了,会删除对应的 key

google:redis expire callback

貌似过期了可以得到通知。


性能问题,第三方去考虑。
pubby
2017-10-13 16:52:45 +08:00
@qiujin +1 beanstalkd 好用
tagtag
2017-10-13 16:53:31 +08:00
被动的超时处理应该没什么疑问,主动的应该只能轮询了吧。
gamexg
2017-10-13 17:03:01 +08:00
订单本身有超时时间字段,需要关注超时时设置这个字段。

每次客户查看订单时检查下是否超时来显示订单状态。

另外后台有个每分钟或更长时间的定时任务处理超时订单,直接查数据库,这个任务主要负责回滚库存或发邮件通知等操作。

除非很大的量,不然太建议过早优化上队列之类的。
即使上专门的队列也需要一个直接查数据库的兜底机制来防止队列丢失数据或执行错误等造成超时订单长时间未处理。
qq316107934
2017-10-13 17:08:08 +08:00
大家都不考虑订单超时之后商品回库的问题吗?感觉还是要用定时器啊
Patrick95
2017-10-13 17:10:58 +08:00
对啊楼上好多人提出的解决方案都没有考虑过订单支付超时商品回库的问题。
cowpea
2017-10-13 17:11:23 +08:00
@whileFalse 我也觉得分钟就行了,没有观测者的话,差个几十秒也没啥(业务特别严谨就另说,再说回来,能被超时取消的单子,用户也不会在乎那几十秒,右侧取整分肯定会多几十秒)。有观测的话,判断超时做处理就好了。
linxl
2017-10-13 17:13:37 +08:00
redis.
每秒都去查询 redis 总不会有啥问题了吧.
linpf
2017-10-13 17:16:19 +08:00
我是做了定时任务,同时每次访问该数据的时候也判断一下。
lilixiang999
2017-10-13 17:21:36 +08:00
python 的话 celery 有一个 countdown 的功能很合适,也能精确到订单维度,在处理 task 的时候订单支付超时 然后商品回库等一系列操作
UnPace
2017-10-13 17:24:07 +08:00
用户主动触发改变订单状态肯定不可行,最合理的就是定时任务扫。
ixixixe2
2017-10-13 17:25:16 +08:00
@qq316107934 搞个 0 点自动检测不就好了
cxbig
2017-10-13 17:30:52 +08:00
Cronjob 每分钟跑一次可以了
gcli
2017-10-13 17:32:54 +08:00
定时任务,每分钟执行一次,超时的订单,更改订单状态,释放资源
orderc
2017-10-13 17:36:50 +08:00
google 延迟队列
dullwit
2017-10-13 17:42:09 +08:00
DelayQueue,支持延时获取元素的无界阻塞队列
gcli
2017-10-13 17:46:06 +08:00
好吧,涨知识了,延迟队列
接下来准备把定时任务替换为延迟队列
minotaur
2017-10-13 17:46:35 +08:00
延迟消息队列 简单点就 redis

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

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

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

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

© 2021 V2EX