項目要求:
? ? 1)預扣庫存及時歸還砚嘴,關系到后來訂單的下單成功
? ? 2)不同類型商品不同時長坝橡,如:商品1訂單10分鐘枷恕,商品2訂單15分鐘......
? ? 3)可伸縮性筏养,根據(jù)并發(fā)量大小增加減少部署結點
? ? 4)并發(fā)量大單節(jié)點內(nèi)部自擴展
? ? 5)結構簡單嫂易,維護簡單
主要流程
1兄朋、生成訂單
2、生產(chǎn)一個消息(orderID,goodsNum)到rabbitmq
3怜械、定時系統(tǒng)消費消息根據(jù)設計的indexcursor規(guī)則異步包裝或處理job颅和,若第3個步驟壓力大,將處理job業(yè)務邏輯分離放入rabbitmq缕允,從mq中消費
草圖1:(滿足不了要求4)
消費流程:
(1)當前格注冊的job的cycleNum++
(2)cycleNum和offset都達到峡扩,set中的job執(zhí)行。
(3)執(zhí)行流程:推送到mq障本,改訂單狀態(tài)的線程消費完job教届,刪除set和注冊表中的job响鹃,執(zhí)行三次,job轉(zhuǎn)存到異常表案训,刪除job买置,歸還扣的庫存。
生產(chǎn)流程:
用戶線程要修改為:支付中强霎,本線程要改為:交易關閉忿项。若用戶線程在前則不安全(只有待支付和支付失敗,可以關單)脆栋;
上草圖2:滿足要求4(根據(jù)并發(fā)量設計時間輪和Ringlist大小倦卖,job初始化數(shù)量)
系統(tǒng)初始化時,初始化輪和ringList(初始化大小100椿争,哪個格子不夠怕膛,擴充N個),同時每個ringList new job實力100個秦踪,避免異步時頻繁增加/刪除job褐捻,每次新訂單任務來了,只setCycleNum椅邓,setOffset柠逞,setOrderId,setNum
增加開銷:維護ringIndex景馁,ringList中判斷要覆蓋的job實例:被處理直接set板壮,否則下一個,ringList滿了觸發(fā)擴充
https://blog.csdn.net/xiaochu_chuxiao/article/details/80995341