秒殺架構設計的 7 個錦囊

今天我們從 7 個不同的維度,講講秒殺系統的架構設計,主要知識點如下:

1. 秒殺業務的特點

2. 總體思路

2.1 削峯限流

安全保護

頁面優化,動靜分離

異步處理

熱點分離

儘量的避免秒殺功能給正常功能帶來的影響,比如秒殺把服務器某個功能拖垮了。

分離可以提升系統的容災性,但是完全的隔離的改造成本太高了,儘量藉助中間件的配置,來實現冷熱分離。

2.2 Nginx 的設計細節

 server {
    listen       8088;
    location ~ \.(gif|jpg|jpeg|png|bmp|swf){  
        root    C:/Users/502764158/Desktop/test;  
    } 

    location ~ \.(jsp|do){
        proxy_pass http://localhost:8082;
    }
 }
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 3;
    gzip_disable "MSIE [1-6]\.";
    gzip_types   text/plain application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png;

配置集羣負載和容災,設置失效重連的時間,失效後,定期不會再重試掛掉的節點,參數:

 upstream  netitcast.com {  #服務器集羣名字   
    server    127.0.0.1:8080;
    server    127.0.0.1:38083;
    server    127.0.0.1:8083;
    } 

 server {
        listen       88;
        server_name  localhost;
    location / {  
        proxy_pass http://netitcast.com;  
        proxy_connect_timeout       1;
        fail_timeout 5;
     } 
 }
  1. 集成 Varnish 做靜態資源的緩存

  2. 集成 tengine 做過載的保護

2.3 頁面優化細節

降低交互的壓力

安全控制

2.4 Redis 集羣的應用

  1. 分佈式鎖(悲觀鎖)

  2. 緩存熱點數據(庫存):如果 QPS 太高的話,另一種方案是通過 localcache,分佈式狀態一致性通過數據庫來控制

分佈式悲觀鎖(參考 redis 悲觀鎖的代碼)

異步處理訂單

2.5 消息隊列限流

消息隊列削峯限流 (RocketMQ 自帶的 Consumer 自帶線程池和限流措施),集羣。一般都是微服務,訂單中心、庫存中心、積分中心、用戶的商品中心

2.6 數據庫設計

要執行的操作:扣減庫存、生成新訂單、生成待支付訂單、扣減優惠券、積分變動

庫存表是數據庫併發的瓶頸所在,需要在事務控制上做權衡:可以把扣減庫存設置成一個獨立的事務,其它操作成一個大的事務(訂單、優惠券、積分操作),提高併發度,但是要做好額外的 check

update 庫存表 set 庫存 = 庫存 - 1 where id=** and 庫存 > 1

2.7 答題驗證碼的設計

驗證碼的設計可以分爲 2 種:

答題的驗證:除了驗證答案的正確性意外,還要統計反應時間,例如 12306 的難題,正常人類的答題速度最快是 1.5s,那麼,小於 1s 的驗證可以判定爲機器驗證

3. 注意事項

爲了提升併發,需要在事務上做妥協:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Cm8mJRt7bHtNKXKQssWAIw