RabbitMQ、消息队列实现订单超时设计思路、以及在订单过期临界点支付成功如何处理

场景:
我们知道用 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、开发、产品、业务,往往是相互结合、相辅相成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章