扣庫存方案
下單減庫存?
- 併發請求
- 創建訂單(惡意下單&不會超賣)
- 扣庫存
- 支付
支付減庫存?
- 併發請求
- 創建訂單(訂單超賣)
- 支付 (訂單支付不了)
- 扣庫存
預扣庫存?
- 併發請求
- 扣庫存
- 創建訂單
- 支付(不支付庫存賣不出去)
先扣庫存然後創建訂單、支付
10分鐘不支付則取消訂單,避免不支付庫存賣不出去問題
極高併發下單服務極致性能
減少上下文切換
較少阻塞式I/O
I/O主要包括
- rpc調用
- 磁盤讀寫
無I/O
- 拆解-扣庫存與寫訂單分開
- 用內存
- 用本地內存
單服務
多服務
- 初始化庫存到本地庫存
- 本地減庫存,成功則進行統一減庫存,失敗則返回
- 統一減庫存成功則寫入MQ,異步創建訂單
- 告知用戶搶購成功
創建、支付訂單
- 與扣庫存服務隔離
- 用戶收到搶購成功、頁面跳轉到訂單中心去支付
讀商品信息頁面
- 與庫存服務隔離
- 商品庫一主多從提高讀能力
- 頁面靜態化+緩存+db實現即可
排隊進度查看
- 數組A儲存排隊中,待創建訂單的用戶;數組B用作索引,存儲uid對應在數組A中的索引位置
- 每次從數組A中依次消費數據,並記錄最近消費的索引值X
- 用戶來查排隊進度時,從hash表B中取出該uid對應存儲的索引值Y;
- 索引值Y-索引值X=排隊進度值
高性能讀庫存
無I/O
- 讀取本地庫存,無則主動拉去一次,有則返回
- 異步腳本定時同步庫存至本地