秒殺系統設計整理

2022-05-03 21:00:10 字數 1905 閱讀 6662

乙個秒殺系統的設計,涵蓋若干要素。比如:

每乙個要素,都是解決乙個具體的問題場景。

讀寫請求分離:

秒殺一般分為2個階段,秒殺準備階段,秒殺階段。

在秒殺準備階段,一般流量會逐漸上公升,使用者會不斷的查詢秒殺商品等待開始。

在這個階段,按資源型別的區別,分為靜態資源&動態介面。靜態資源提前走cdn部署或者類似小程式這種直接打包在終端本地,可以忽略這部分請求的壓力。動態介面需要做好資料的讀快取,有效期可以相對放長一些,可以防止查詢流量進入db。

在秒殺階段,一般寫入流量會多於查詢流量。

在這個階段的寫請求,一般會經歷如下步驟:

讀請求,則直接從快取讀即可,少部分mis的再請求db。

流量篩選:

秒殺品一般價效比比較高,容易招來黑產刷單。為了盡量避免被褥羊毛,一般會在閘道器側實時清洗流量,比如按ip,uid等維度識別時間跨度內的訪問頻率,命中規則的放入黑名單直接拒絕流量進入秒殺系統。如果刷單嚴重,會在秒殺系統中留存賬號請求記錄,匯入實時計算引擎結合風控模型分析後,進一步按使用者行為分析篩除羊毛黨,一般到這一步基本的羊毛黨都能識別出來。

讀快取:

讀請求走快取,一般的問題在於快取的命中率。比如,秒殺開始前的讀請求,查詢商品詳情的資料需要快取時間較長,到達秒殺時刻時,要及時更新狀態等。這種情況下一般是在快取資料中儲存上了生效時間,**中只是在獲取到後進行一次判斷。

在寫請求成功後,一般要更新快取的資料。在併發密集的情況下,一般走非同步佇列批量進行。縮減主流程涉及環節。

寫批量:

在合適的寫請求進入佇列後,為了提公升消費者的處理效率,可以看條件批量提取資料,提公升消費者的處理能力。比如搶券場景下,產品可能設計成使用者可以多次領取多張,多種券,大部分使用者的領券,動作、時機、內容高度相似,完全具備整合批量執行的能力。這種情況下,消費端批量消費寫請求,可以降低對db的壓力,減少請求的等待時間,提公升qps。

一種實現方案如下圖所示:

寫序列:

針對熱點key的寫操作,是多個例項下多個執行緒競爭乙個行鎖。此時系統競爭的激烈程度與效能是成反比的。為了降低這種無意義的損耗,可以基於熱點key做本地鎖。限制乙個例項同一時刻僅有乙個執行緒可以參與去競爭行鎖,其餘的全部返還失敗。即例項級別序列執行。

預處理:

在前端業務系統呼叫寫操作api前,可以再進行一次預檢查,盡量提前發現不滿足條件的寫請求,避免將壓力傳導到下層環節。

前端介面優化:

這部分優化得看產品設計。有些秒殺品僅允許購買一次,但是有些允許購買多次。限制條件往往豐富且多維。比如:最近購買次數少於2次;最多允許購買2份等。這種情況下的秒殺,前端介面只能跟隨後端的邏輯來判斷是否允許按鈕點選與否。後端可以通過redis的bitmap,以商品維度打標進行維護,這個資料不保證精確性,僅維持大部分情況下正確(即可以不考慮分布式一致性,基本正確就可以),能篩掉冗餘流量就達到目的。簡單起見,秒殺品只能下單一次,提交訂單後,前端頁面自行按鈕置灰。如果提交失敗,可以通過重新整理頁面重新獲取後端的判斷,然後再根據這個判斷控制顯示。

dns優化:

dns是為了尋找網域名稱對應真實ip用的,一般業務網域名稱為了防攻擊會經過一層高防,然後再由高防轉slb進行流量分發。高防的成本相對較高,可以嘗試結合客戶端本地dns,走httpdns的模式,後端聚合若干個小容量的slb進行流量的客戶端負載均衡,可以在一定程度上避免高防成本過快增長。

自我保護:

系統必須能支援冪等邏輯。不能因為高頻併發產生超賣,超發的情況。比如多個同樣的請求一起發起,不能成功多次,只能允許成功乙個。這種情況下,可以分幾個階段來做處理。第乙個階段,通過在redis中記錄成功數量攔截掉持續不斷的冗餘流量;第二階段,通過資料庫層面的一致性,確保邏輯冪等。資料庫冪等,一般的方式是依賴資料庫的唯一鍵來做。但是,單純的依賴資料庫的唯一鍵,容易產生資料庫死鎖,同時,還存在對於資料庫鎖的競爭。為了優化這個問題,可以依賴redis做分布式鎖邏輯,將資料庫記錄的唯一索引,轉換成redis的key值進行處理。

乙個典型的處理過程如下圖所示:

秒殺系統設計

秒殺場景一般會在電商 舉行一些活動或者節假日在12306 上搶票時遇到。對於電商 中一些稀缺或者 商品,電商 一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性,會吸引大量使用者前來搶購,並且會在約定的時間點同時在秒殺頁面進行搶購。限流 鑑於只有少部分使用者能夠秒殺成功,所以要限制大部分流量,...

秒殺系統設計

一 穩 1 前端 1 前端靜態資源快取 cdn 按鈕置灰 ip限流 一段時間內現在使用者ip 2 同一userid限制訪問頻率,超過頻率返回同乙個頁面,進行限流。利用驗證碼防止惡意攻擊。後端 1 請求丟到mq中按照訊息佇列進行處理,進行削峰 2 因為秒殺是讀多寫少,把庫存資料預先載入到redis中,...

秒殺系統設計

1 什麼是秒殺系統 秒殺系統 就是網路商家為 商品,以低 商品賣出做的限時限量搶購活動 2 秒殺系統可以解決什麼問題,用在哪些場景 解決問題 解決網路商家快速 商品,以低 商品賣出做的限時限量搶購活動 應用場景 商品搶購 3 秒殺系統會出現什麼問題,解決方案 出現的問題 1 併發量大 2 防止超賣 ...