如何解決秒殺的性能問題和超賣的討論

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

最近業務試水電商,接了一個秒殺的活。之前經常看到淘寶的同行們討論秒殺,討論電商,這次終于輪到我們自己理論結合實際一次了。

  ps:進入正文前先說一點個人感受,之前看淘寶的ppt感覺都懂了,等到自己出解決方案的時候發現還是有很多想不到的地方其實都沒懂,再次驗證了“細節是魔鬼”的理論。并且一個人的能力有限,只有大家一起討論才能想的更周全,更細致。好了,閑話少說,下面進入正文。

?

一、秒殺帶來了什么?

?

?

  秒殺或搶購活動一般會經過【預約】【搶訂單】【支付】這3個大環節,而其中【搶訂單】這個環節是最考驗業務提供方的抗壓能力的。

  搶訂單環節一般會帶來2個問題:

  1、高并發

  比較火熱的秒殺在線人數都是10w起的,如此之高的在線人數對于網站架構從前到后都是一種考驗。

  2、超賣

  任何商品都會有數量上限,如何避免成功下訂單買到商品的人數不超過商品數量的上限,這是每個搶購活動都要面臨的難題。

?

二、如何解決?

?

  首先,產品解決方案我們就不予討論了。我們只討論技術解決方案

1、前端

  面對高并發的搶購活動,前端常用的三板斧是【擴容】【靜態化】【限流】

  A:擴容

  加機器,這是最簡單的方法,通過增加前端池的整體承載量來抗峰值。

  B:靜態化

  將活動頁面上的所有可以靜態的元素全部靜態化,并盡量減少動態元素。通過CDN來抗峰值。

  C:限流

  一般都會采用IP級別的限流,即針對某一個IP,限制單位時間內發起請求數量。

  或者活動入口的時候增加游戲或者問題環節進行消峰操作。

  D:有損服務

  最后一招,在接近前端池承載能力的水位上限的時候,隨機拒絕部分請求來保護活動整體的可用性。

?

2、后端

  那么后端的數據庫在高并發和超賣下會遇到什么問題呢?主要會有如下3個問題:(主要討論寫的問題,讀的問題通過增加cache可以很容易的解決)

  I: 首先MySQL自身對于高并發的處理性能就會出現問題,一般來說,MySQL的處理性能會隨著并發thread上升而上升,但是到了一定的并發度之后會出現明顯的拐點,之后一路下降,最終甚至會比單thread的性能還要差。

  II:?其次,超賣的根結在于減庫存操作是一個事務操作,需要先select,然后insert,最后update -1。最后這個-1操作是不能出現負數的,但是當多用戶在有庫存的情況下并發操作,出現負數這是無法避免的。

  III:最后,當減庫存和高并發碰到一起的時候,由于操作的庫存數目在同一行,就會出現爭搶InnoDB行鎖的問題,導致出現互相等待甚至死鎖,從而大大降低MySQL的處理性能,最終導致前端頁面出現超時異常。

?

  針對上述問題,如何解決呢? 我們先看眼淘寶的高大上解決方案:

  I: ?關閉死鎖檢測,提高并發處理性能。

  II:修改源代碼,將排隊提到進入引擎層前,降低引擎層面的并發度。

  III:組提交,降低server和引擎的交互次數,降低IO消耗。

  以上內容可以參考丁奇在DTCC2013上分享的《秒殺場景下MySQL的低效》一文。在文中所有優化都使用后,TPS在高并發下,從原始的150飆升到8.5w,提升近566倍,非常嚇人!!!

  不過結合我們的實際,改源碼這種高大上的解決方案顯然有那么一點不切實際。于是小伙伴們需要討論出一種適合我們實際情況的解決方案。以下就是我們討論的解決方案:

  首先設定一個前提,為了防止超賣現象,所有減庫存操作都需要進行一次減后檢查,保證減完不能等于負數。(由于MySQL事務的特性,這種方法只能降低超賣的數量,但是不可能完全避免超賣)

update number set x=x-1 where (x -1 ) >= 0;

?

解決方案1:

  將存庫從MySQL前移到Redis中,所有的寫操作放到內存中,由于Redis中不存在鎖故不會出現互相等待,并且由于Redis的寫性能和讀性能都遠高于MySQL,這就解決了高并發下的性能問題。然后通過隊列等異步手段,將變化的數據異步寫入到DB中。

  優點:解決性能問題

  缺點:沒有解決超賣問題,同時由于異步寫入DB,存在某一時刻DB和Redis中數據不一致的風險。

?

解決方案2:

  引入隊列,然后將所有寫DB操作在單隊列中排隊,完全串行處理。當達到庫存閥值的時候就不在消費隊列,并關閉購買功能。這就解決了超賣問題。

  優點:解決超賣問題,略微提升性能。

  缺點:性能受限于隊列處理機處理性能和DB的寫入性能中最短的那個,另外多商品同時搶購的時候需要準備多條隊列。

?

解決方案3:

  將寫操作前移到Memcached中,同時利用Memcached的輕量級的鎖機制CAS來實現減庫存操作。

  優點:讀寫在內存中,操作性能快,引入輕量級鎖之后可以保證同一時刻只有一個寫入成功,解決減庫存問題。

  缺點:沒有實測,基于CAS的特性不知道高并發下是否會出現大量更新失敗?不過加鎖之后肯定對并發性能會有影響。

?

解決方案4:

  將提交操作變成兩段式,先申請后確認。然后利用Redis的原子自增操作(相比較MySQL的自增來說沒有空洞),同時利用Redis的事務特性來發號,保證拿到小于等于庫存閥值的號的人都可以成功提交訂單。然后數據異步更新到DB中。

  優點:解決超賣問題,庫存讀寫都在內存中,故同時解決性能問題。

  缺點:由于異步寫入DB,可能存在數據不一致。另可能存在少買,也就是如果拿到號的人不真正下訂單,可能庫存減為0,但是訂單數并沒有達到庫存閥值。

?

三、總結

?

  1、前端三板斧【擴容】【限流】【靜態化】

  2、后端兩條路【內存】+【排隊】

?

四、非技術感想

?

  1、團隊的力量是無窮的,各種各樣的解決方案(先不談可行性)都是在小伙伴們七嘴八舌中討論出來的。我們需要讓所有人都發出自己的聲音,不要著急去否定。

  2、優化需要從整體層面去思考,不要只糾結于自己負責的部分,如果只盯著一個點思考,最后很可能就走進死胡同中了。

  3、有很多東西以為讀過了就懂了,其實不然。依然還是需要實踐,否則別人的知識永遠不可能變成自己的。

  4、多思考為什么,會發生什么,不要想當然。只有這樣才能深入進去,而不是留在表面。

  ps:以上僅僅是我們討論的一些方案設想,歡迎大家一起討論各種可行方案。?

轉載于:https://my.oschina.net/u/131940/blog/732760

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458058.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458058.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458058.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 從Excel中讀取時間數據

之前寫到從Excel中讀取時間數據 //讀取Excel數據Excel.Application xapp new Excel.Application();string filepath txt_Excel.Text;Excel.Workbook xbook xapp.Workbooks._Open(filepath, Missing.Value, Missing.Value,Missing.Value, Missing.Value, Missing.Value, Miss…

grid autosport額外內容下載慢_清理大王app下載-清理大王v1.0安卓下載

清理大王,下面由小編給大家介紹一下這款軟件,該軟件是一款非常不錯的手機清理服務應用軟件,清理大王app為用戶提供了手機垃圾清理,內存加速,優化手機,解決手機卡頓的情況。感興趣的朋友歡迎使用微俠下載&am…

(轉)瀏覽器兼容的JS寫法總結

-、元素查找問題1. document.all[name] (1)現有問題:Firefox不支持document.all[name] (2)解決方法:使用getElementsByName(name),getElementById(id)等來替代。 2. 集合類對象問題 (1)現有問題:IE中對許多集合類對…

java面試總結(第一天)

臨近大學畢業,出來試試找工作,學c#出身,半路出家java,做過幾個ssh、stringMVC的項目。基礎知識不太扎實,勿噴 以下是我面試過程中遇到的問題 ----------------------------------------------------------------------…

怎么看cudnn的版本好_祖墳風水怎么看,好祖墳有什么征兆?

人們之所以看重祖墳的風水,是因為祖墳的風水與后代子孫的運勢密切相關,可以說祖墳的風水好不好關系著子孫后代的運勢順不順,因此對于祖墳的風水好壞人們是非常在意的,那么祖墳風水怎么看,好祖墳有什么征兆呢?下面是小編…

iOS - Swift SQLite 數據庫存儲

前言 采用 SQLite 數據庫來存儲數據。SQLite 作為一中小型數據庫,應用 iOS 中,跟前三種保存方式相比,相對比較復雜一些。注意:寫入數據庫,字符串可以采用 char 方式,而從數據庫中取出 char 類型&#xff0c…

Hibernate 多對多關聯查詢條件使用

from Brand as b inner join fetch b.styles as s where s.styleId? 轉載于:https://www.cnblogs.com/cocoat/p/5427467.html

Spark 寬依賴和窄依賴

2019獨角獸企業重金招聘Python工程師標準>>> 我們知道RDD就是一個不可變的帶分區的記錄集合,Spark提供了RDD上的兩類操作,轉換和動作。轉換是用來定義一個新的RDD,包括map, flatMap, filter, union, sample, join, groupByKey, co…

smart gesture安裝失敗_WinCC flexible SMART V3 SP2安裝步驟以及常見錯誤解決方法

1安裝配置1. win7和win10系統都可以裝2. 運行內存至少要2G。3. 硬盤儲存空間至少要3G。2安裝注意事項1.安裝本軟件之前必須要關閉所有殺毒軟件(例如360安全衛士/360殺毒/電腦管家)等。2.其它西門子軟件不要使用或者打開。3.安裝之前確保硬盤空間充足。3下載地址https://bbs.jcp…

各類數據集整理(持續更新中ing)

轉自:https://zhuanlan.zhihu.com/p/84088095 最近一次新增:2020.02.11 大家好,先給各位抱拳了!我是和鯨(科賽 http://kesci.com)的運營一枚,今天給大家分享以下我們(通過網線&…

Java Experiment 3 PairProgramming

http://www.cnblogs.com/20145106ssr/p/5428222.html 轉載于:https://www.cnblogs.com/Christen/p/5428655.html

啟動頁面和各設備的寬高比及像素

2019獨角獸企業重金招聘Python工程師標準>>> iOS7只能用LaunchImage來布置啟動畫面,只能用圖片。iOS8以后支持LaunchScreen.xib來布置,可以自己添加控件。iOS8以及以后的用LaunchScreen來配置啟動頁。iOS8以后的會走這個設置,而io…

cc壓力測試_中小型網站如何防范CC攻擊?

大公司就不說了,付費CDN,防火墻,WAF,大流量,一般也會配置專門的安全問題響應團隊。今天側重討論一下中小型網站如何(優雅)防范CC攻擊。中小站點安全問題通病:對安全問題不重視&#…

ubuntu16.04 360隨身WiFi2

查看kernel版本,插入360隨身WiFi2,打開終端,執行下面命令即可。 ------------------------------------------------------------------------------------------------------------- From your kernel version, 4.2.0-16, it appears that…

泛型復習

回顧泛型類 泛型類&#xff1a;具有一個或多個泛型變量的類被稱之為泛型類1、class A<T>{} 2、在創建泛型實例時&#xff0c;需要為其類型變量賦值A<String> anew A<String>(); *如果創建實例時&#xff0c;不給類型變量賦值&#xff0c;那么會有一個警告&am…

.net core EPPlus npoi_2020 ASP.NET界面開發:DevExpress v20.1支持.NET Core設計時

DevExpress ASP.NET Web Forms Controls擁有針對Web表單(包括報表)的110種UI控件&#xff0c;DevExpress ASP.NET MVC Extensions是服務器端MVC擴展或客戶端控件&#xff0c;由輕量級JavaScript小部件提供支持的70個高性能DevExpress ASP.NET Core Controls&#xff0c;包含功能…

ubuntu android studio SDK emulator directory is missing

ctrlH&#xff0c;搜索Android studio&#xff0c;把所有的都刪除&#xff0c;再次安裝即可下載

有關于我的一點想法

之前失眠寫的&#xff0c;從空間搬運過來 之前一直想寫一下有關自己想法。趁著失眠寫一寫。 不知道是不是幸運&#xff0c;我有幸認識了吳寶俊老師。他寫博客&#xff0c;我經常去看他寫的博客。后來在留言板發言幾次也就熟了。雖然也僅限網友吧……但是我需要人給我指點迷津。…

mac電腦如何與手機同步復制粘貼_如何將電腦里的文件同步到手機里?

由于PDF的特殊性&#xff0c;一般很少有適用于手機編輯的軟件&#xff0c;所以我們都習慣于使用電腦來修改PDF文檔后&#xff0c;再發送到手機微信發送給其他人&#xff0c;那么如何快速將電腦里的PDF文件同步到手機里面呢&#xff1f;可能很多人會想到使用各種云盤&#xff0c…

走進緩存的世界(一) - 開篇

系列文章 走進緩存的世界&#xff08;一&#xff09; - 開篇走進緩存的世界&#xff08;二&#xff09; - 緩存設計走進緩存的世界&#xff08;三&#xff09; - Memcache概述 對于程序員來說多多少少都懂一點算法&#xff0c;算法是什么&#xff1f;算法是“時間”與“空間”的…