1. 程式人生 > 程式設計 >秒殺系統有那麼複雜嗎?

秒殺系統有那麼複雜嗎?

限制流量

靜態資源
  • 靜態資源怎麼得要上個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個訂單時,可直接返回“搶光了”,保證有一部分客戶訂單失效時,仍然達到預期銷售量。