用戶下完訂單到支付完成期間需频,需要鎖定庫存防止超賣,如何不依賴數(shù)據(jù)庫筷凤,實現(xiàn)較高負載呢昭殉?
常見的方案是頻繁的讀取數(shù)據(jù)庫中的訂單,統(tǒng)計總庫存占用藐守,檢查是否付款超時挪丢。如果系統(tǒng)的負載量較高,這種方案很快將數(shù)據(jù)庫的CPU占用達到極限卢厂,系統(tǒng)響應速度迅速下隆乾蓬。
我在一個項目中應用了消息隊列(RabbitMQ)的方案實現(xiàn)的這個需求,分享一下慎恒。
簡化流程:
下單時任内,第一步要操作的,就是遍歷訂單里的商品列表融柬,將商品數(shù)量累加到 Redis 庫存占用上死嗦,防止超賣。
在商品詳情頁粒氧,展示的?商品可用庫存 = 商品庫存 - 庫存占用
第二步操作越除,將訂單寫入MQ隊列,因為訂單是按時間順序?qū)懭腙犃械耐舛ⅲ宰钕仁У挠唵我欢ㄊ顷犑椎挠唵卫鹊小R虼耍媱澣蝿罩恍枰h(huán)檢查隊首的訂單
如果訂單付款時間未超時门怪,假如還有 50 秒骡澈,則休眠 50 秒后繼續(xù)處理。
如果訂單已到達超時時間掷空,則檢醒訂單原始狀態(tài)
如果訂單原始狀態(tài)已非未付款(如已付款肋殴,已取消),則將訂單移出隊列坦弟,處理下一單
如果訂單原始狀態(tài)仍為未付款护锤,則釋放庫存占用
注意,取消訂單操作需要主動釋放庫存占用酿傍。
計劃任務內(nèi)流程:
在我們的項目中烙懦,有一種特殊 VIP 的用戶,他們的未付款超時時間長達12小時(普通用戶半小時)赤炒,他們常用這種方式免費鎖定庫存氯析,我們暫不關(guān)注這種需求的合理性亏较,系統(tǒng)如何實現(xiàn)呢?
在MQ中加一條隊列即可掩缓,半小時超時的一個隊列雪情,12小時超時的一個隊列
本文原始網(wǎng)址:https://www.liu12.com/article/pending-order-hold-stock-mq-scheme,轉(zhuǎn)載請保留出處