一個秒殺系統的設計
阿新 • • 發佈:2019-03-03
隊列 參與 對象 基本 必須 中間 負載 web 數據完整性
系統功能
- 鑒權登錄
- 展示簡單用戶基本信息
- 秒殺
- 記錄用戶停留點擊軌跡
業務數據
- 用戶量:1000萬+
- 估計參與秒殺總用戶量:100萬以內
- 估計每次秒殺參與用戶量:10萬以內
- 秒殺對象:紅包、免費電子券
系統特點
- 功能非常簡單(可看作完全沒什麽業務)
- 重點支撐高並發,應用不能崩垮
- 秒殺的數據完整性必須保證,放第一位
- 登錄放第二位、用戶觸點放最後。用戶信息查詢不涉及增刪改
設計要點
- 作為獨立系統,不影響其他系統
- 登錄需支持微信公眾號(或微信小程序)、APP、手機瀏覽器
- 不考慮PC端
設計
技術選擇設計
- 采用內存數據庫redis(集群),實現登錄、用戶信息、秒殺
- 采用消息隊列kafka(集群),記錄用戶觸點
- 采用nginx(集群),負載用戶訪問
- 采用前後端分離開發,前端Vue2.5,後端springboot
- 應用使用docker和tomcat部署
redis設計
- 用戶量大,key采用短縮寫命名,節省內存
- 用戶信息用google的protobuf序列化,節省內存,提供讀取效率
- 隨機短信驗證碼采用list存儲,pop讀取後不繼續保留占用內存
- 部署40臺redis集群,每臺給redis分配32G內存左右
- 主從備份,也有600G內存可用,每個用戶基本信息和業務信息如果為10K,總共也就100G,應完全足夠
kafka設計
- 4臺kafka集群,每臺好像100個分區(具體忘了,時間太久了)
- 寫一個後臺應用程序,讀取kafka到mysql或oracle,進行用戶觸點分析與管理
nginx設計
- 域名買阿裏雲的,https證書也買阿裏雲的,在上面配置好指向F5
- F5配置指向4臺nginx負載,ssl證書在nginx上配置
- 同時預留4臺nginx,配置同前面4臺,但不啟動(如果負載不夠再啟動)
- 按照每臺nginx支撐3萬的並發,4臺應該足夠,但是一般保守估計為1萬,所以預留
- 優化linux配置,優化nginx配置,支撐高並發(詳見我寫的另一篇blog)
限流設計
- 限流,防止系統雪崩
- 通過nginx配置實現
- nginx支持簡單的限流配置,共三種
- 按ip限
- 按主機限
- 按流量限
- 三種全用上,每ip限10個連接,每主機1萬連接,流量每秒1兆(千兆帶寬)
- 熔斷先不弄
應用開發設計
- 用戶基礎信息一次讀取,放內存,不多次讀取
應用部署設計
- 40臺主機部署tomcat,每臺用docker啟動2個,共80個
- vue用webpack前端工程化,編譯成少量的css和js文件,盡量少占用http連接
安全設計
- https
- 登錄驗證(不用落後的加密算法,如DES和3DES)
- 盡量用nginx和vue擋在前面,RESTful不讓訪問
- 特別秒殺的應用要保護好,代碼采用多重判斷驗證
系統效果
- 最終用戶量沒預計的大
- 出現了一次短時間的503錯誤(估計當時訪問量很大)
- 沒有故障,沒有投訴
- 但其實很多地方都做的不好,下次再做的話要改進
2019.3.3記錄(共用時45分鐘,中間喝了一杯牛奶)。
一個秒殺系統的設計