1. 程式人生 > >qps20w背後的設計:秒殺\搶券專案——深度分析與總結

qps20w背後的設計:秒殺\搶券專案——深度分析與總結

之前參與一個峰值qps達到20w多的電商促銷專案,現在做一些總結與思考,可能存在紕漏,歡迎交流探討。本人長期專注於服務層,文中對前端以及運維的理解可能不夠深入

歡迎各位有理有據的交流探討。

架構隔離

在開始具體細節時,先說說架構隔離。

對於這個促銷系統的部署完全與主站的其他系統隔離開,避免大流量衝擊下對其他系統造成影響,甚至雪崩。

  • 域名隔離 使用獨立的域名對請求做隔離
  • 應用隔離 使用獨立的叢集機器部署前端應用與服務端應用
  • 資料隔離 使用獨立的Redis叢集、mysql叢集處理資料

前端流控

  • 基本校驗 一些簡單的資格校驗,如登陸等等
  • 頁面靜態資料快取 瀏覽器快取靜態資料、CDN快取靜態資料。
  • 業務流程削峰 通過使用驗證碼或者問答,拉車秒殺時間,放緩瞬時併發。

反向代理快取

在反向代理(Varnish,Nginx)中快取靜態頁面,對頁面請求直接返回。
這裡寫圖片描述

服務端設計

服務端是本文重點,也是我關注的地方。

實現無鎖設計(資料庫的部分根據業務場景用樂觀鎖):

圖片較大,我希望用一張圖描述我想說的,請點選右鍵單獨放大檢視。
這裡寫圖片描述

擴容

沒有機會做,但是思考了下這種方案可取。還是用一張圖
這裡寫圖片描述

分庫分表

待續

快取擊穿問題解決

待續

叢集效能常用計算公式

qps(query per second)=併發數/響應時間(通常要求0.1s左右)

tps(transaction per second)=事務數/響應時間(事務 比如介面指有個clientSend
並且clientReceive的過程)

  • 如何 根據服務日呼叫次數 計算每天峰值的qps?

    ( 日呼叫次數 * 80% ) / ( 24*3600 * 20% ) = 峰值時間每秒請求數(QPS)  
    
  • 單節點qps

    最大連線數/平均響應時間()=qps
    

    通常最大執行緒數<=最大連線數
    平均響應時間通常要求100ms左右

  • 根據峰值qps與單節點qps計算節點個數?

    峰值介面需要的QPS / 單節點的QPS = 需要的節點例項
    
  • 示例:
    每天300w 呼叫量的介面,這個介面需要滿足到多少QPS?

      ( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS) 
    

    單機QPS是58,需要結果節點來支援?**

    139 / 58 = 3