1. 程式人生 > >一個秒殺系統的設計

一個秒殺系統的設計

隊列 參與 對象 基本 必須 中間 負載 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分鐘,中間喝了一杯牛奶)。

一個秒殺系統的設計