日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

秒杀系统设计的 5 个要点:前端三板斧+后端两条路!

發布時間:2025/3/21 HTML 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 秒杀系统设计的 5 个要点:前端三板斧+后端两条路! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

秒殺系統涉及到的知識點

  • 高并發,cache,鎖機制

  • 基于緩存架構redis,Memcached的先進先出隊列。

  • 稍微大一點的秒殺,肯定是分布式的集群的,并發來自于多個節點的JVM,synchronized在所有JVM上加鎖是不行了

  • 數據庫壓力

  • 秒殺超賣問題

  • 如何防止用戶來刷, 黑名單?IP限制?

  • 利用memcached的帶原子性特性的操作做并發控制

?

秒殺簡單設計方案

比如有10件商品要秒殺,可以放到緩存中,讀寫時不要加鎖。 當并發量大的時候,可能有25個人秒殺成功,這樣后面的就可以直接拋秒殺結束的靜態頁面。進去的25個人中有15個人是不可能獲得商品的。所以可以根據進入的先后順序只能前10個人購買成功。后面15個人就拋商品已秒殺完。

?

假設我們的秒殺場景

比如某商品10件物品待秒. 假設有100臺web服務器(假設web服務器是Nginx + Tomcat),n臺app服務器,n個數據庫

第一步 如果Java層做過濾, 可以在每臺web服務器的業務處理模塊里做個計數器AtomicInteger(10)=待秒商品總數,decreaseAndGet()>=0的繼續做后續處理, <0的直接返回秒殺結束頁面,這樣經過第一步的處理只剩下100臺*10個=1000個請求。

第二步, memcached 里以商品id作為key的value放個10, 每個web服務器在接到每個請求的同時, 向memcached服務器發起請求, 利用memcached的decr(key,1)操作返回值>=0的繼續處理, 其余的返回秒殺失敗頁面,這樣經過第二步的處理只剩下100臺中最快速到達的10個請求。

第三步, 向App服務器發起下單操作事務。

第四步, App服務器向商品所在的數據庫請求減庫存操作(操作數據庫時可以 "update table set count=count-1 where id=商品id and count>0;" update 成功記錄數為1, 再向訂單數據庫添加訂單記錄, 都成功后提交整個事務, 否則的話提示秒殺失敗,用戶進入支付流程。

?

看看淘寶的秒殺

一、前端

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

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

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

  • 限流:一般都會采用IP級別的限流,即針對某一個IP,限制單位時間內發起請求數量。或者活動入口的時候增加游戲或者問題環節進行消峰操作。

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

二、那么后端的數據庫在高并發和超賣下會遇到什么問題呢

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

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

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

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

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

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

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

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

優點:解決性能問題

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

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

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

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

解決方案3:將寫操作前移到MC中,同時利用MC的輕量級的鎖機制CAS來實現減庫存操作。

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

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

解決方案4:將提交操作變成兩段式,先申請后確認。然后利用Redis的原子自增操作,同時利用Redis的事務特性來發號,保證拿到小于等于庫存閥值的號的人都可以成功提交訂單。然后數據異步更新到DB中。

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

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

?

總結

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

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

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的秒杀系统设计的 5 个要点:前端三板斧+后端两条路!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲成人黄色av | 猎艳山村丰满少妇 | av免费一区 | 91在线观| 黄色www视频 | 日韩久久综合 | 免费黄色的网站 | 久久国产日韩 | av免费网站观看 | 亚洲aa在线观看 | 欧美日韩a√ | 中国极品少妇videossexhd 就要干就要操 | 免费av在线网址 | 久久久91精品 | 成人毛片观看 | 精品久久久久久久久久久久久久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 制服丝袜一区在线 | jizz在线观看视频 | 久久在线观看 | 亚洲综合性 | 三级在线网站 | 人妻av一区二区三区 | 找av导航 | 欧美性生交xxxxx久久久缅北 | 成人免费区一区二区三区 | 亚洲最大福利网 | 欧美自拍第一页 | 97精品熟女少妇一区二区三区 | 99精品区 | 91av观看 | 亚洲久草视频 | www.蜜臀av| 豆花视频成人 | 在线视频观看 | 中文字幕在线观看国产 | 黄色一级黄色片 | 88xx成人永久免费观看 | av五十路| 国产成人手机在线 | 午夜免费成人 | 精品一区二区三区成人免费视频 | 免费三级av| 扒开伸进免费视频 | 乱人伦av| 午夜精品久久久久久久四虎美女版 | 欧美成人性生活 | 色婷婷婷 | 粉嫩小箩莉奶水四溅在线观看 | av免费不卡 | 少妇被狂c下部羞羞漫画 | 亚洲一区二区不卡视频 | 中文字幕一区二区人妻 | 国产美女主播 | 亚洲小说在线 | 日韩精品乱码久久久久久 | 国产精品探花一区二区三区 | 国产精品一区二区电影 | 国产精品18久久久久久无码 | 日韩欧美视频一区 | 欧美伦理一区二区三区 | 国产不卡精品 | 麻豆疯狂做受xxxx高潮视频 | 国产99精品 | 久久久国产精品久久久 | 日本在线观看一区 | 女人张开双腿让男人捅 | 91av俱乐部 | 国产美女流白浆 | 日韩在线www | 二区三区免费 | 香蕉视频在线免费 | 亚洲 欧美 日韩 国产综合 在线 | 无人在线观看高清视频 | 91影音| 亚洲一区二区三区蜜桃 | 五月天91| 国产欧美日韩另类 | 伦理自拍| 性歌舞团一区二区三区视频 | 老妇裸体性猛交视频 | 午夜一区| 免费观看黄色网页 | 欧美日韩一区二区在线视频 | 色视频免费在线观看 | 福利在线看 | 久久久久久久国产精品视频 | 老司机综合网 | 伊人久久综合 | 欧美浓毛大泬视频 | 三级亚洲欧美 | 午夜一区 | 黑人巨大精品 | 两根大肉大捧一进一出好爽视频 | videos麻豆 | 亚洲三区视频 | 国产色网址| 粉嫩av一区二区三区免费观看 | 中文字幕av一区二区三区人妻少妇 |