qps20w背後的設計:秒殺\搶券專案——深度分析與總結
阿新 • • 發佈:2019-01-08
之前參與一個峰值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