秒杀抢购系统的实现
一、秒殺系統介紹及遇到的挑戰
1. 什么是秒殺?
秒殺是網絡賣家發布一些超低價格的商品,所有買家在同一時間網上搶購的一種銷售方式。由于價格比價低廉,一上架就被搶購一空,有時只需要幾秒鐘,所以非常考驗系統的并發能力。當然,秒殺常見形式有1元秒殺、低價限量秒殺(小米限量秒殺,12306分段限量秒殺)、低價限時限量秒殺(電商平臺偏多)。
2. 秒殺業務分析
1.正常電子商務流程
(1)查詢商品;(2)創建訂單;(3)扣減庫存;(4)更新訂單;(5)付款;(6)賣家發貨
2.秒殺業務特性流程
(1)低廉價格;(2)大幅推廣;(3)瞬時售空;(4)一般是定時上架;(5)時間短、瞬時并發量高;
3.秒殺實現技術挑戰
(1)秒殺技術挑戰
假設某網站秒殺活動只推出一件商品,預計會吸引1萬人參加活動,也就說最大并發請求數是10000,秒殺系統需要面對的技術挑戰有:后面將談到的前端層面和業務層面的問題
(2)對現有網站業務造成沖擊
秒殺活動只是網站營銷的一個附加活動,這個活動具有時間短,并發訪問量大的特點,如果和網站原有應用部署在一起,必然會對現有業務造成沖擊,稍有不慎可能導致整個網站癱疾。
解決方案:將秒殺系統獨立部署,甚至使用獨立域名,使其與網站完全隔離。
秒殺系統架構圖:
3. 秒殺搶購實現遇到的問題
- 前端層面:
1.突然增加的網絡及服務器帶寬
2.防止用戶重復提交 - 業務層面:
1.如何防止商品超賣問題
2.服務器單臺機器承受不了
3.如何限制用戶操作頻率
4.如何防止用戶作弊行為
注:秒殺本質也屬于高并發優化方案
因為微服務之間互不影響,宕機不至于影響其他服務;當并發量超出預期,Docker部署快速擴容;
分庫分表,r/w分離;
使用MQ異步修改庫存; - - - 這兩種治標不治本
使用令牌桶+MQ異步修改庫存 ;- - -推薦方案
使用數據庫樂觀鎖(CAS鎖,此種方式有個問題如:100庫存100用戶搶購,最終只有60個用戶秒殺成功,原因是當未獲取CAS鎖時,當前請求失效,自旋則無此問題,其實秒殺用戶很多,最終也會全部秒殺成功);
使用Redis實現分布式鎖;
使用令牌桶+MQ異步形式實現修改庫存(有一個用戶等待過程)
使用Redis的SETNX命令,key為用戶phone,并指定key過期時間,如10s
二、秒殺系統的實現
1. 秒殺頁面前端優化方案(CDN內容分發)
1M寬帶等于多少Kbps?等于128KB/S,如果加載一個網頁含靜態資源需要640/KB,那么就需要5秒時間加載整個網頁。
靜態資源優化方案
1.is/css/img實現壓縮減少帶寬的傳輸、將靜態資源放入第三方資源服務器中(七牛云、阿里OSS)等。
2.商品詳情頁面使用Nginx實現緩存,Lua+OpenResty實現商品詳情頁面的更新;也可以使用時間戳參數更新Nginx靜態資源緩存。
思路:可以給頁面表單提前生成隱藏域參數,用戶提交表單后臺根據該參數判斷該表單是否已經提交。
2. 基于MQ+庫存令牌桶實現異步修改庫存
秒殺搶購修改庫存如何減少數據庫IO操作:
場景:在高并發情況下,如果突然有10萬個不同用戶的請求進行秒殺,但是商品的庫存數量只有100個,那么這時候可能會出現10萬個請求執行修改秒殺庫存sql語句,這時候可能會出現數據庫訪問壓力承受不了?
解決方案:讀寫分離,分庫分表,Redis緩存庫存等…但是這些方案都是治標不治本,不管秒殺是否成功,每個請求都會對數據庫做讀寫操作,造成數據庫壓力增大。
最終解決方案:
提前生成100(庫存數量)個令牌,用戶獲取到令牌才能執行修改庫存的sql語句。
總結
- 上一篇: 图书分类页面php,PHP开发简单图书借
- 下一篇: oracle scn和headroom