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、開發、產品、業務,往往是相互結合、相輔相成

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