秒殺系統主要是有三個特點高效能、高併發、高可用。
從一次秒殺的流程出發,考慮秒殺系統的三個特點,那麼就可以設計一個秒殺系統。
1. 秒殺頁面獲取
優化方案:
- 動靜分離。將頁面的靜態資源等部署到Nginx或者CDN,這樣可以加快秒殺頁面獲取。
- 靜態資源合併獲取。通過將多個請求合併為單個請求,一次獲取多個靜態資源,這樣可以加快秒殺頁面獲取。
- 服務降級。秒殺頁面做服務降級處理,將商品推薦列表、評論等做降級處理,少顯示或者不顯示。秒殺頁面需要登入才能檢視,對未登入使用者直接返回登入介面。
- 服務監控。對流量進行監控,使用令牌桶演算法等限流演算法對流量進行控制。有必要時將部分任務進行熔斷。
- 頁面資料快取。將頁面資料快取到Redis中,減少資料庫操作。
- 秒殺連線加鹽。使URL動態化,可以減少非法使用者操作。
2. 商品下單
優化方案:
- 前端/後端限流。前端/客戶端防抖。限制時間間隔內的下單次數。
- 防機器人刷單。對下單操作增加填寫驗證碼步驟,如:55+44=?、“你好”的小寫拼音、選出所有飛機等問題,將非法請求過濾掉。
- 商品下單預扣庫存。資料庫表設計的時候需要設定鎖庫存欄位。進行秒殺的時候,減少庫存將在Redis中使用分散式鎖進行操作。其它後續操作可以使用RabbitMQ進行操作。
- 商品下單預扣庫存(庫存預熱)可以新增延時佇列。將超時商品轉發到死信路由,然後進行操作。
- 商品下單可以進行非同步操作,如雙次驗價等操作可以使用多執行緒。
3. 支付
優化方案:
- 將支付劃分為一個單獨的系統,只開放對應的支付介面。因為支付系統是金融敏感的,所以應該保證支付系統的高可用。
- 回滾機制。建議使用分散式事務,對支付業務進行TCC事務,因為支付系統是金融敏感的。
於是,秒殺系統一般會引入MQ、Redis、MySQL、Nginx等中介軟體,需要對每個中介軟體進行高效能、高併發、高可用的分析。
MQ
優化方案:
- 叢集部署。MQ系統一般都是叢集部署的,進行映象叢集部署,可以提升系統的可用性。
- 開啟持久化。對MQ系統中的資訊開啟持久化,將其刷到硬碟內,防止當機。
- 關閉消費自動ACK,需要進行手動ACK。防止資訊消費異常。
Redis
優化方案:
- Redis進行讀寫分離,Master節點進行寫操作,其他節點進行讀操作。
- Redis進行哨兵部署,讓某一個節點當機後可以迅速有機器頂替上。
- Redis進行分片叢集部署,讓請求分佈到每一臺Redis機器上。
- 開啟持久化日誌。AOF和RDB根據業務狀況進行調整。
- 一個系統可以有多個Redis叢集,例如頁面資料和商品下單兩個方面的Redis可以用多個叢集的Redis。
MySQL
優化方案:
- 根據業務建立索引。唯一索引、普通索引、聯合索引等。
- 看業務是否有優化的地方,減少回表操作。
- 分庫分表。MySQL應該進行叢集部署,單臺Redis一般只有2000QPS左右。
- 分庫。使用MyCat或者ShardingSphere等進行分庫,將操作通過演算法分配到相對應的機器上面。
- 分表。分表有垂直劃分和水平劃分兩種。垂直劃分是將部分欄位分割到其它表上面。水平劃分是將資料水平劃分到同一資料庫中的不同表上面,避免一個表上面的資料過大。
- 一般來說,建議分32個庫,每個庫分32張表,這樣完全能夠滿足大部分企業的需求。
- MySQL的瓶頸是磁碟IO,可以更換固態硬碟。
Nginx
優化方案:
- 動靜分離。將靜態資源部署到Nginx中,無需到其它中介軟體中查詢。
- Nginx可以開啟限流操作。令牌桶和露銅演算法都支援。
- Nginx開啟負載均衡,將服務請求打到不同的伺服器上,降低單臺伺服器壓力。
除了上面列出來的,還有很多的優化操作。
熱點資料分離
熱點商品和普通商品使用的系統可以隔離開來,這樣即使秒殺系統當機了,普通的商品下單也不會有任何問題。
- 秒殺商品放到熱點資料系統內。
- 直播商品也可以放到熱點資料系統內。
- 流量監控。可以將下單比較多的商品放到熱點資料系統內。
- 商家上報。商家可以將未來可能售賣較多的商品上報,放到熱點資料系統內。
- 資料分析。分析以往資料,得出一些未來可能售賣較多的商品,放到熱點資料系統內。
效能優化
最後可以進行機器上面的效能優化。
- 更換CPU
- 更換記憶體
- 更換速度更快的硬碟
- 更新Linux系統核心
- 更新軟體系統穩定版本
- 關閉Linux上面一些無用的服務
秒殺系統主要是有三個特點高效能、高併發、高可用。只要對這三個點進行思考,那麼就會慢慢得出一個秒殺系統。