场景:
我们知道用 RabbitMQ 的延时队列可以实现用户下单后在 xxx 时间内未支付,需要自动关闭订单。但如果用户在订单即将过期的最后一秒支付成功、那么这笔订单算不算正常下单?要不要释放库存?
一、下单未支付超时自动关闭订单设计思路
1、以 30分钟 为例,订单表必须的字段
订单状态、订单支付状态、订单过期时间、库存是否释放、库存释放时间
【1】订单状态:已下单、待出库、运输中、派送中、已取消、已关闭等
【2】订单支付状态:已支付、未支付
【3】订单过期时间:此字段可返回给前端,用于倒计时的起点。取值为用户下单时候订单信息落库时间+30分钟,下单接口可使用异步线程同时把订单信息落库、丢入消息队列
【4】库存是否释放:是、否
【5】库存释放时间:此字段要晚于订单过期时间 1 到 2 分钟,避免订单过期后库存立刻释放而被其他订单冻结,用于临界点支付成功的缓冲时间
二、用户在订单即将超时的最后一秒支付成功,这笔订单如何处理?
1、此问题需要开发和产品业务沟通,由产品决定算下单成功还是关闭订单
2、产品决定临界点支付成功,算正常下单成功
【1】更新订单状态(出库中)、扣减库存
3、产品决定临界点支付成功,算下单失败
【1】此时需要退款、更新订单状态(已关闭)、立刻释放库存(更新库存是否释放)
三、订单过期,MQ收到消息处理
1、判断该订单支付状态
【1】已支付:这里不做任何操作(由支付成功回调接口操作)
【2】未支付:更新订单状态(已关闭)、 1 到 2 分钟(库存释放时间 - 订单过期时间)后判断支付状态,如果还是未支付、就释放库存(更新库存是否释放为是)
四、总结
1、开发思维不要仅限于技术,要走出技术的误区
2、开发、产品、业务,往往是相互结合、相辅相成