意见征求:异步处理数据状态和数据实际状态同步

场景

订单30分钟未支付自动取消,用户下单的时候,写入一个30分钟的延时队列,问题:30分钟到的时候可能队列阻塞,临界点查询的时候可能订单状态还是待支付,但是实际上应该是已取消!

解决方案(有不合理或者不对的地方希望能指出来)

方案1:在模型事件retrieved中查询下单时间超过30分钟但是状态还是未支付的订单执行以下订单取消代码
方案2:状态不用数据库字段,根据多个字段(时间、是否支付等字段)返回一个订单状态

目前方案二是我常用的,请问大家还有没有比较合理的方案!

让PHP再次伟大
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 13

取消订单的时候加上过滤条件,只有状态是待支付的才能自动取消

1年前 评论
Slowlyo
换种思路:
  • artisan 命令 : 每分钟查询一次 需要取消 的订单, 并处理
  • 订单操作相关的接口 (列表/详情等…) 增加中间件, 查询并处理需要取消的订单 (下单时间距现在超过30分钟的订单)
1年前 评论
Slowlyo (作者) 1年前
Slowlyo (作者) 1年前
Slowlyo (作者) 1年前
Slowlyo (作者) 1年前
勇敢的心 (楼主) 1年前
勇敢的心 (楼主) 1年前
勇敢的心 (楼主) 1年前
Complicated 1年前

30 分钟到的时候可能队列阻塞,临界点查询的时候可能订单状态还是待支付,但是实际上应该是已取消!

查询的哪里?查询的不就是实际吗

1年前 评论

第1种方案,你这个可以用定时任务,每分钟跑一遍,把所有未支付的设置成取消。定时任务稳定发生,就不会有这个问题了。
第2种方案,队列是可以有多个的。你看下larave的文档。然后把这个取消的单独用一个队列,这样应该会并发执行。
第3种方案,换连接,就是队列的后端,把这种你认为需要及时处理的单独放那个连接。
第4种方案,忽略这个问题,因为重要性比较低,别改代码。
第5种方案,就是你的第2种方案,结合待支付和下单时间判断。

1年前 评论

可以对 订单号 添加缓存有效期,支付时根据有效性分开处理;失效队列任务里也加上相应的有效性判断~

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!