我们做了一个商城项目,如果会员下了一个订单后需要在 24 小时内支付,否则失效。该如何来设计这个逻辑呢? 我现在能想到的就是给每个订单加上过期时间,然后写个定时任务 每分钟去检查每个订单的过期时间和当前时间做对比,然后更新订单状态。 还有没有更好的方法呢?不知道淘宝之类的是怎么做的
失效后不需要做什么其他数据更新,在用户点显示订单时,判断当前时间和订单 created at 的差就可以了。 要失效时更新商品的,比如库存加一,那就永定时任务扫描。
#5 楼 @marksloan 你们是采用的下单即更新库存的方式?如果是一定要这么做的话,可以考虑用 sidekiq,然后设定 24 小时后检查这张订单。如果是在失效时间内已经支付,可以同时从定时队列中移除这个任务。
首先定义一个“苦逼”的 worker 来干活:
# app/workers/order_expiration_checker.rb
class OrderExpirationChecker
include Sidekiq::Worker
def perform(id)
order = Order.find id
do_some_stuff if order.unpaid? && order.expired? # 订单未支付,并且已经超过有效期
end
end
然后在每次下单时,自动将订单加入定时任务,24h 后执行检查:
# app/models/order.rb
class Order < ActiveRecord::Base
after_create :check_expiration
def expired?
created_at + 24.hours < Time.now
end
private
def check_expiration
OrderExpirationChecker.perform_in(24.hours, id)
end
end
#5 楼 @marksloan +1 如果失效需要更新其他数据,那么使用定时任务。
库存计算使用 四柱结算法 当前库存 = 上期库存 + 本次入库数量 - 本次出库数量
如果不把订单设置一个过期标识,存在两个问题。
之前有过一个类似的需求:http://hooopo.iteye.com/blog/757760