1. 程式人生 > >電商秒殺活動的技術分析

電商秒殺活動的技術分析

秒殺活動是絕大部分電商選擇的低價促銷、推廣品牌的方式。不僅可以給平臺帶來使用者量,還可以提高平臺知名度。一個好的秒殺系統,可以提高平臺系統的穩定性和公平性,獲得更好的使用者體驗,提升平臺的口碑,從而提升秒殺活動的最大價值。

這裡使用redis來處理秒殺活動。

秒殺的特徵:

秒殺活動對稀缺或者特價的商品進行定時定量售賣,吸引成大量的消費者進行搶購,但又只有少部分消費者可以下單成功。因此,秒殺活動將在較短時間內產生比平時大數十倍,上百倍的頁面訪問流量和下單請求流量。

秒殺活動分為三個階段:

(1)秒殺前:使用者不斷的重新整理商品詳情頁面,頁面請求達到瞬時峰值。

(2)秒殺開始:使用者點選下單按鈕,下單請求達到瞬時峰值。

(3)秒殺後:校驗指定時間內沒有支付的訂單時退單情況,大部分使用者繼續重新整理商品詳情頁等待退單機會。

消費者提交訂單,一般做法是利用資料庫的行級鎖,只有搶到鎖的請求可以進行庫存查詢和下單操作。但是在高併發的情況下,資料庫無法承擔如此大的請求,往往會使整個服務 blocked,在消費者看來就是伺服器宕機。所以我們不能使用資料庫來處理。

ç³»ç»æ¶æå¾

前端分流處理:

秒殺前,使用者不斷重新整理商品詳情頁,造成大量的頁面請求。所以,我們需要把秒殺商品詳情頁與普通的商品詳情頁分開。對於秒殺商品詳情頁儘量將能靜態化的元素靜態化處理,除了秒殺按鈕需要服務端進行動態判斷,其他的靜態資料可以快取在瀏覽器和 CDN 上

。這樣,秒殺前重新整理頁面導致的流量進入服務端的流量只有很小的一部分。

讀寫分離redis快取攔截流量:

可以把秒殺商品的一些資訊快取到讀寫分離redis中,並設定秒殺的開始標識如下:

  1. "goodsId_count": 100 //商品總數
  2. "goodsId_start": 0 //開始標記  0表示未開始,1表示開始(根據倒計時判斷)
  3. "goodsId_access": 0 //接受下單數
  1. 秒殺開始前,服務叢集讀取 goodsId_Start 為 0,直接返回未開始。
  2. 資料控制模組將 goodsId_start 改為1,標誌秒殺開始。
  3. 服務叢集快取開始標記位並開始接受請求,並記錄到 redis 中 goodsId_access,商品剩餘數量為(goodsId_count - goodsId_access)。
  4. 判斷商品剩餘數量為0時,秒殺結束,攔截所有請求。
  5. 把下單成功的資料寫入資料庫中,記錄訂單號,下單數量,使用者id等資訊。(此步自己思考應該把下單成功的使用者存起來)

利用主從版 Redis 快取加速減庫存

成功參與下單後,進入下層服務,開始進行訂單資訊校驗,庫存扣量。為了避免直接訪問資料庫,我們使用主從版 Redis 來進行庫存扣量,主從版 Redis 提供10萬級別的 QPS。使用 Redis 來優化庫存查詢,提前攔截秒殺失敗的請求,將大大提高系統的整體吞吐量。

通過資料控制模組(資料庫中讀取秒殺商品的庫存)提前將庫存存入 Redis,將每個秒殺商品在 Redis 中用一個 hash 結構表示。

  1. "goodsId" : {
  2. "Total": 100
  3. "Booked": 100
  4. }

沒整理完,待續。。。。。。。。