如何設計一個秒殺系統?

護髮師兄發表於2022-06-06

秒殺系統主要是有三個特點高效能高併發高可用

從一次秒殺的流程出發,考慮秒殺系統的三個特點,那麼就可以設計一個秒殺系統。

1. 秒殺頁面獲取

優化方案:

  1. 動靜分離。將頁面的靜態資源等部署到Nginx或者CDN,這樣可以加快秒殺頁面獲取。
  2. 靜態資源合併獲取。通過將多個請求合併為單個請求,一次獲取多個靜態資源,這樣可以加快秒殺頁面獲取。
  3. 服務降級。秒殺頁面做服務降級處理,將商品推薦列表、評論等做降級處理,少顯示或者不顯示。秒殺頁面需要登入才能檢視,對未登入使用者直接返回登入介面。
  4. 服務監控。對流量進行監控,使用令牌桶演算法等限流演算法對流量進行控制。有必要時將部分任務進行熔斷。
  5. 頁面資料快取。將頁面資料快取到Redis中,減少資料庫操作。
  6. 秒殺連線加鹽。使URL動態化,可以減少非法使用者操作。

2. 商品下單

優化方案:

  1. 前端/後端限流。前端/客戶端防抖。限制時間間隔內的下單次數。
  2. 防機器人刷單。對下單操作增加填寫驗證碼步驟,如:55+44=?、“你好”的小寫拼音、選出所有飛機等問題,將非法請求過濾掉。
  3. 商品下單預扣庫存。資料庫表設計的時候需要設定鎖庫存欄位。進行秒殺的時候,減少庫存將在Redis中使用分散式鎖進行操作。其它後續操作可以使用RabbitMQ進行操作。
  4. 商品下單預扣庫存(庫存預熱)可以新增延時佇列。將超時商品轉發到死信路由,然後進行操作。
  5. 商品下單可以進行非同步操作,如雙次驗價等操作可以使用多執行緒。

3. 支付

優化方案:

  1. 將支付劃分為一個單獨的系統,只開放對應的支付介面。因為支付系統是金融敏感的,所以應該保證支付系統的高可用。
  2. 回滾機制。建議使用分散式事務,對支付業務進行TCC事務,因為支付系統是金融敏感的。

於是,秒殺系統一般會引入MQ、Redis、MySQL、Nginx等中介軟體,需要對每個中介軟體進行高效能高併發高可用的分析。

MQ

優化方案:

  1. 叢集部署。MQ系統一般都是叢集部署的,進行映象叢集部署,可以提升系統的可用性。
  2. 開啟持久化。對MQ系統中的資訊開啟持久化,將其刷到硬碟內,防止當機。
  3. 關閉消費自動ACK,需要進行手動ACK。防止資訊消費異常。

Redis

優化方案:

  1. Redis進行讀寫分離,Master節點進行寫操作,其他節點進行讀操作。
  2. Redis進行哨兵部署,讓某一個節點當機後可以迅速有機器頂替上。
  3. Redis進行分片叢集部署,讓請求分佈到每一臺Redis機器上。
  4. 開啟持久化日誌。AOF和RDB根據業務狀況進行調整。
  5. 一個系統可以有多個Redis叢集,例如頁面資料和商品下單兩個方面的Redis可以用多個叢集的Redis。

MySQL

優化方案:

  1. 根據業務建立索引。唯一索引、普通索引、聯合索引等。
  2. 看業務是否有優化的地方,減少回表操作。
  3. 分庫分表。MySQL應該進行叢集部署,單臺Redis一般只有2000QPS左右。
    1. 分庫。使用MyCat或者ShardingSphere等進行分庫,將操作通過演算法分配到相對應的機器上面。
    2. 分表。分表有垂直劃分和水平劃分兩種。垂直劃分是將部分欄位分割到其它表上面。水平劃分是將資料水平劃分到同一資料庫中的不同表上面,避免一個表上面的資料過大。
    3. 一般來說,建議分32個庫,每個庫分32張表,這樣完全能夠滿足大部分企業的需求。
  4. MySQL的瓶頸是磁碟IO,可以更換固態硬碟。

Nginx

優化方案:

  1. 動靜分離。將靜態資源部署到Nginx中,無需到其它中介軟體中查詢。
  2. Nginx可以開啟限流操作。令牌桶和露銅演算法都支援。
  3. Nginx開啟負載均衡,將服務請求打到不同的伺服器上,降低單臺伺服器壓力。

除了上面列出來的,還有很多的優化操作。

熱點資料分離

熱點商品和普通商品使用的系統可以隔離開來,這樣即使秒殺系統當機了,普通的商品下單也不會有任何問題。

  1. 秒殺商品放到熱點資料系統內。
  2. 直播商品也可以放到熱點資料系統內。
  3. 流量監控。可以將下單比較多的商品放到熱點資料系統內。
  4. 商家上報。商家可以將未來可能售賣較多的商品上報,放到熱點資料系統內。
  5. 資料分析。分析以往資料,得出一些未來可能售賣較多的商品,放到熱點資料系統內。

效能優化

最後可以進行機器上面的效能優化。

  1. 更換CPU
  2. 更換記憶體
  3. 更換速度更快的硬碟
  4. 更新Linux系統核心
  5. 更新軟體系統穩定版本
  6. 關閉Linux上面一些無用的服務

秒殺系統主要是有三個特點高效能高併發高可用。只要對這三個點進行思考,那麼就會慢慢得出一個秒殺系統。

相關文章