秒殺系統
起因
秒殺系統一直是一個熱門問題,涉及到的知識也很多,高並發、緩存、負載、請求過濾、資料庫不一致、數據層甁頂等問題。這些問題五一不是都會在面試,或者工作中遇到。接下來,小編就來講講自己的架構心得
初期部署
- 客戶端發送請求;
- 服務端接收請求;
- 數據層根據請求返回信息。
存在問題
- 透到數據層的無效請求過多;
- 資料庫甁頂;
- 資料庫不一致問題;
- 同一個用戶購買多次問題。
原因
- 100W人同時瀏覽頁面,產生100W的讀請求;
- 用戶瘋狂點擊秒殺按鈕,生成多次的秒殺請求;
- 程序for循環的惡意請求;
- 多個用戶並發修改數據,出現數據覆蓋現象,導致數據不一致。
方法
- 秒殺系統中有99%的請求都是讀取數據,所以我們可以引入緩存層,直接過濾所有的讀請求,這樣數據層就能減少99%的壓力;
- 每次搶購需要判斷庫存,這一步可以移到緩存層,如果有剩餘庫存,直接將請求發送到數據層中,庫存不足,則直接返回庫存不足;
- 100W人同時搶購100件商品,99.99W人的請求是無效的,可以過濾500請求到數據層(可能有些人因為網路原因,秒殺失敗);
- 前端JS增加點擊限制措施(3秒內只有一個請求發送),避免用戶同一時間內發起多個請求;
- 服務層限制每個用戶ID一定時間內只能透過一次請求,防止程序員的for循環等惡意攻擊;
- 資料庫修改庫存時增加樂觀鎖(每次修改庫存時都要判斷資料庫中的庫存是否和查詢出來的庫存一致),避免一致性問題。
最後部署
- 每個客戶端3秒內發送一個請求;
- 服務端同一個用戶一定時間內只能透過一次請求到數據層,其它請求全部拋棄;
- 讀請求發送到緩存層,獲取數據返回;
- 緩存層將合法的秒殺請求發送到數據層;
- 數據層接收請求,並啟用樂觀鎖,執行資料庫的庫存扣減,防止出現超賣現象(有少數一部分請求,因為並發問題,返回秒殺失敗)。
問:如果存在眾多殭屍用戶請求怎麼辦?
答:這個沒辦法完全防禦,只能通過限制IP(可以通過IP的相似性判斷),來防禦。平時也需要注意這些不活躍用戶,如果每次秒殺活動都活躍起來的,殭屍用戶的嫌疑很大。這點小編也沒什麼好的辦法。
總結
今天主要講了大用戶數據下,秒殺系統如何優化,主要有以下幾點:
- 客戶端、服務端限制請求次數;
- 緩存層過濾所有讀請求;
- 緩存層只透過庫存*N的秒殺請求到資料庫;
- 資料庫採用樂觀鎖防止商品超賣。
結語
- 此文章是小編根據自己的經驗和網上看到的方法總結出來的;
- 具體部署,需要結合自身的業務;
- 讓我們一起學習,一起進步。
推薦閱讀: