商城订单超过 30 分钟未支付自动取消订单,最佳解决方案是怎样? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
商城订单超过 30 分钟未支付自动取消订单,最佳解决方案是怎样?
? 8 天前 ? 3913 次点击
如果用定时任务设置一个每秒执行的脚本,那样可能影响服务器性能。
70 回复 &| &直到
08:53:49 +08:00
查询订单状态时检查是否超时
创建订单的时候 创建一个 30 分钟后执行的异步任务 如果支付成功取消这个任务 如果没有支付 就会自动执行。
定时任务每分钟呢?
怎么影响性能?
& &8 天前 via Android
提出一个推测的建议:因为最早之前 steam 上支付卡单,支付后显示 pending。最终都是整点到库(听说是 union pay 的锅)。所以我感觉都是整点检测吧,或者定一个时间段。
@ 因为倒计时是按每秒计算。
@ 我也是这么考虑的
1.cron
2.用户进入订单或者后台***进行订单操作时进行过期处理。
不要担心服务器性能。服务器性能是用来消耗的。
& &8 天前 via Android
不用定时啊,只要客户重新查看这个订单,假如超时了,那么就做相应处理,假如一年都不访问,那就一直保持未超时的状态。
生成订单时就创建一个过期时间的字段,根据这个字段来判断是否过期。
用 redis 被动过期,客户端查询订单就从 redis 里取判断,redis 里的 key 过期,就取消订单
首先取消时业务逻辑做好判断
然后另外有个轮询取消任务就可以了
做过类似的。
做个队列一个个按时间丢进去进行,然后开个定时器每隔一段时间从队列头部拿出来一个检查是否到时间,倒了就拿出来改状态更新到数据库。
检查前先去库里检查是否到手动被取消,若已被取消从队列头推出。
设计一个任务中心,使用延时任务。
要留记录就定时每秒执行,不留记录直接 30 分钟的缓存
每分钟执行就可以了
反正都是取消订单, 你还在乎时间延时么.
即使最后一秒他付款了, 那不就是目的么 , 而且退款流程加入队列
我来抬杠了。
一般订单失败,是会给用户发邮件的。如果状态迟迟不更新,用户邮件功能如何实现?
记得微信高可用公众号分享过一个类似文章。
1,每个商品一个定时器还是全局一个定时器。每个商品一个的话,太耗性能。所以全局一个。
2,全局一个定时器怎么知道谁到了时间谁没到。遍历一遍页耗性能。
方案是如果倒计时 30 分钟,精确到 1 分钟,就建 30 个队列,有个游标,1 分钟换下一个队列,新插的放这个队列,然后失效再下一个队列并清空。
使用 beanstalkd 这种有延迟任务功能的队列
1. 客户进入到自己的订单列表,岂不是很多未支付订单
2. 如果客户下了 10 个单超时未支付,那么我们后台管理系统中-订单列表查看的话还要处理一次。
如果不需要推送通知的话,有必要搞定时器么?
判定时间状态不允许操作就是了
Redis 里面有个 expire 的功能,时间到期了,会删除对应的 key
google:redis expire callback
貌似过期了可以得到通知。
性能问题,第三方去考虑。
@ +1 beanstalkd 好用
被动的超时处理应该没什么疑问,主动的应该只能轮询了吧。
& &8 天前 via Android
订单本身有超时时间字段,需要关注超时时设置这个字段。
每次客户查看订单时检查下是否超时来显示订单状态。
另外后台有个每分钟或更长时间的定时任务处理超时订单,直接查数据库,这个任务主要负责回滚库存或发邮件通知等操作。
除非很大的量,不然太建议过早优化上队列之类的。
即使上专门的队列也需要一个直接查数据库的兜底机制来防止队列丢失数据或执行错误等造成超时订单长时间未处理。
& &8 天前 via Android
大家都不考虑订单超时之后商品回库的问题吗?感觉还是要用定时器啊
对啊楼上好多人提出的解决方案都没有考虑过订单支付超时商品回库的问题。
@ 我也觉得分钟就行了,没有观测者的话,差个几十秒也没啥(业务特别严谨就另说,再说回来,能被超时取消的单子,用户也不会在乎那几十秒,右侧取整分肯定会多几十秒)。有观测的话,判断超时做处理就好了。
每秒都去查询 redis 总不会有啥问题了吧.
我是做了定时任务,同时每次访问该数据的时候也判断一下。
python 的话 celery 有一个 countdown 的功能很合适,也能精确到订单维度,在处理 task 的时候订单支付超时 然后商品回库等一系列操作
用户主动触发改变订单状态肯定不可行,最合理的就是定时任务扫。
@ 搞个 0 点自动检测不就好了
Cronjob 每分钟跑一次可以了
定时任务,每分钟执行一次,超时的订单,更改订单状态,释放资源
google 延迟队列
DelayQueue,支持延时获取元素的无界阻塞队列
好吧,涨知识了,延迟队列
接下来准备把定时任务替换为延迟队列
延迟消息队列 简单点就 redis
记录创建时间,再次操作的时候检查超时,超时了有后续处理的话(比较麻烦的情况)设置状态+进队列,怕太多再搞个定期 dump 归档之类的
“最优解”要看你超时了有什么业务什么处理
& &8 天前 via Android
guava 里有一个 cache,可以参考它的原理。
首先你的订单在失效的时候需要有两个状态 一个是 失效 另外一个是完成失效, 失效可以用失效时间在记录中提现, 小于当前时间的都是属于失效, 然后在后台任务中慢慢处理失效的订单的其他回退的操作, 比如退款, 库存之类的, 都处理完后再设置状态为完成失效.
延迟 ( dead )队列 + Job 补充 解决问题
前后台分别进行
前台 js 负责倒计时,倒计时结束后向后台发送一个倒计时结束的请求,此时后台检查是否确实已经超时了
后台把这个计时加入延迟队列,采用 redis 的话就把检查实际间隔设置断些,几秒几十秒;磁盘数据库的话就 1~2 分钟甚至 3~5 分钟都可以。
有的解决方案能解决问题,有的就是小玩具
这种东西肯定得依赖中间件的,不管是分布式存储,分布式消息队列还是分布式锁
难道一个商城只有一台服务器一个服务么......
就算最简单的每秒扫一次库更新状态,N 台服务器之间怎么分配任务...
这些都是线上产品需要解决的问题
玩具无视,单机就太简单了......
可以参考我的实现
不知道大家有没有注意到
cloudxns 每次登陆,有时候能收到一些域名取消托管的邮件。
所以,你可以用户进行某些操作后,去触发一些任务。
& &8 天前 via Android
定时任务总还是蛮担心的,一旦启动,就像是开闸放出来的猛兽。要么出现队列任务卡住的情况,本该清理的数据堆积如山,;要么干了不该干的事情。总之,完全无人值守的任务,还是定期去喵一眼,比较放心(??ω`?)
我的高可靠性解决方案:
创建订单之后, 写到延迟队列里一个任务, 同时记录数据库, 失效时间
兜底轮训, 每一分钟轮训一遍数据库, 根据订单状况+失效时间, 这两个字段加个索引, 如果觉得处于代付款的订单不多的话,可以加在订单状态上.
成功之后, 改订单状况.
对于我们的业务是够了, 30 分钟能有多少个未付款的订单 ?? k 级别的轮训一遍小事呀~
python 的话,celery 可以做到。以前做电商做过类似的,可以用 celery 配合 rabbitmq 做成延迟队列的形式。
不过目前市面上也有不少延迟队列服务,可直接使用
创建订单的时候就插入延迟队列,设置 30 分钟延迟
worker 长轮训这个队列,30 分钟自动可见,消费的时候开启事务锁订单,检查是否已支付,如果未支付就关单退优惠券,已支付的话就删除消息
@ 一般我也是这么做,等他查询的时候更改状态。但是自从有了微信模板消息,就 tm 不好用了。客户说 30 分钟没付款,你给他发个模板消息,这就尴尬了
& &8 天前 via Android
@ 我觉得这种方式成本高,你需要考虑异步任务执行意外的情况,比如异常中止怎么办,重启服务器怎么办等,如果考虑异步任务恢复就要面临集群,调度等。
这个不用走队列吧,只需要在操作订单相关的时候对比一下时间就行了吧
延迟队列
扫描太耗性能了
& &8 天前 via Android
rabbitmq 延时队列,定时任务扫全库扑杀漏网之鱼
& &8 天前 via iPhone
楼上又是 crontab 又是队列的真是服了你们了,至于这么复杂么?生成订单写一个时间戳和 ID,下次用户再访问“我的订单”时取消这个超时的订单就行了,如果用户再也不访问这个订单了,你还关心这个 ID 搞毛线啊?
@ 商品要回库,再也不访问会影响库存
@ #60 那这样我能把你家的库存占用完,订单失效库存要回库啊。
完全符合楼主要求...
@ 我理解成了给钱才发货
定时任务啊
这种基础组件应该有做一个吧.
@ 可以使用 jobcenter 一类的以秒为单位的计划任务。
@ 这个确实符合,但是这个是 go 写的,有 php 写的没,
@ #64 给钱了没货了怎么办,大家都来订单你都说好好好给钱就发货,然后你没那么多货,不就 gg 了。有一个商品下单商品占位的过程。
@ 延迟队列 + 兜底定时任务,不过需要考虑队列和任务对同一个订单同时取消的问题
1.订单表增加过期时间字段,用在查询页面展示并在用户试图操作的时候拒绝(同时触发回库逻辑)
2.同时跑一个固定间隔的计划任务,每隔一段时间(根据业务和负载决定),将订单表中的过期记录关闭(避免 1 没有触发导致回库的问题)
& ? & 1500 人在线 & 最高记录 3541 & ? &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 ? 66ms ? UTC 04:32 ? PVG 12:32 ? LAX 21:32 ? JFK 00:32? Do have faith in what you're doing.新浪广告共享计划>
广告共享计划
从时客网的繁荣解析中国“快生活”
&&&&近日,中国六大最忙城市新鲜出炉,香港、苏州、深圳、台北、广州、上海“光荣”上榜。大城市的迅速发展使得人们以一种“如果有钱是一种错,我宁愿将错就错”的心态为了生计四处奔波,中国的城市节奏是一种怎样的状态?人们面对这一现状又是如何应对的呢?从当下的繁荣便可管窥一二。
正所谓知己知彼方能百战不殆,从时客网入手解析中国生活节奏现状,我们就不得不对时客网有所了解。时客网作为睿泰科技集团旗下网站,是国内首家采用“小时计费、每周结算”模式的新型在线工作平台。其主要网站特点在于网站使用客户端计时,按小时计算任务价值,真正实现网赚过程公平透明。
首先,创新小时计费,实现雇主与雇员的双赢。时客网的兴起时间不长,却能在网赚平台上迅速走红,在威客猪八戒主打的网赚市场轻松分羹,这是时客网在SWOT分析定位上的成功,也是中国城市化发展快节奏生活下人们惜时如金心态的侧面反映。与其空洞地说时间就是生命,人们更加注重时间就是金钱,越来越多的人利用闲暇时间加入网赚大军,甚至不少人成为职业网赚者,可是“不中标=白费劲”的网赚模式却让这些人的赚钱梦在中标信息公布的瞬间成为泡影,于是在雇员间形成不成文的潜规则:网赚有风险,时间投资需谨慎。而时客网的创新小时计费模式,正是对这一问题的正确反映和规避的结果。
其次,接轨国外主流,领先国际化服务外包形式。时客网在国内方兴未艾,成为网赚者眼中的香饽饽,在国外以两大主流外包服务网站Elance及Odesk为代表的时客模式却早已成为风尚。这一模式以其优越的公平性,成为服务外包行业的大趋势。国外的成功先例展示了时客模式的可行性以及光明前景,同时反映了在经济发展日新月异的中国,服务外包行业疾驰的发展速度,雇员对服务外包行业公平性的需求的日益增加,以及中国人“漠视时间”时代的远去。时客网的应运而生在于其为雇员提供了一个他们急需的公平透明的网赚平台,其先进的国际时客模式,是中国在公平实效方面与国际接轨的产物。
最后,精准雇佣计时,时客网角色定位到个人。越来越多有能力的人摆脱朝九晚五的时间束缚,选择做自由工作者。时客网这样的平台使得他们自由工作生活的同时赚得更多,其首款实现“小时计费”的客户端软件时客计,雇员工作时开启客户端计时,每周提交工作时间及成果给雇主,使雇员按有效工作时间获得相应报酬,这就使得网赚中的雇佣双方角色定位明确到个人。同时,近期时客网新推出的定时频道可以雇员雇主商定每天工作时间段,如可规定每周一的下午5-9点工作,非工作时间工作无效,这种定时方式将精准计时从时间点到时间段进一步明确化,也使雇主雇员的网上合作管理更加方便,为更多年轻人创造更多的成功可能。可以说,是网络的发展和时代的进步催化了中国自由工作者人数的逐步攀升。
时客网这一模式不同于传统威客模式----若不能中标,则所费时间精力都是徒劳无功,而是遵循了“1小时报酬=1小时劳动=1小时成果”的原则,为雇员规避网络兼职陷阱,可以说,这是由原来雇主单方面“称大”到雇主雇员的双赢。时客模式的崛起,反映了中国城市快节奏自由工作生活的现状,以及中国人面对这一现状从漠视时间到惜时如金的心态转变以及工作维权意识的强化。时客网积极改变和推进中国年轻一代的生活方式,更多的雇员涌入也繁荣了网赚雇主市场,其背后隐藏的经济潜力同样不容忽视。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。