秒殺系統有那麼複雜嗎?
阿新 • • 發佈:2019-12-31
限制流量
靜態資源
- 靜態資源怎麼得要上個CDN吧,要不買伺服器也得花錢,還要配置,多麻煩
- 有了CDN,秒殺頁面的URL繫結個域名即可,其他啥也不用配置
介面
- 閘道器總有限流功能吧,按需把80%流量直接返回搶購失敗訊息,20%流量正常進入秒殺策略
至此,大部流量被稀釋了,以下進入正常的秒殺策略。
秒殺策略
本文采用了併發鎖,併發鎖更好的支援業務
併發鎖
- redis setnx
- 分散式併發鎖
變數
- limit - 秒殺數量
- product - 商品唯一標籤
- project - 秒殺專案唯一標籤
- book - 實時產生的訂單表(uuid,status)
- inervalBook - 監控book定時器,實時更新book,可以通過book檢視當前訂單數量,和使用者是否已存在
- inervalOver - 監控book定時器,實時檢視book中所有訂單是否所有都支付完成,此時達到limit則設定結束標籤,活動結束
- 如果需要實時更新庫存,可以在設定一個定時器
介面
- checkOrder - 下單介面
- getOrderStatuss - 查詢訂單介面,該介面需要根據uuids列表返回對應的訂單status列表,以便實時更新book
流程
redis併發鎖不足
總結
一般為支付訂單有效期為15分鐘,如果某個使用者在15分鐘才支付或者一直未支付直到失效,就會浪費一個庫存;如果庫存滿了,但真實購買量並沒有滿,假設我們規定此時新使用者去搶,返回“搶光了”的訊息,那麼使用者就不會去搶了,於是浪費一個名額;假設我們規定返回“請繼續搶”,那麼使用者持續搶15分鐘,體驗很差。
針對以上問題,我們可以根據經驗適當擴大庫存量,比如預計秒殺100臺,那麼庫存可以增加到105,這樣,當產生105個訂單時,可直接返回“搶光了”,保證有一部分客戶訂單失效時,仍然達到預期銷售量。