冠縣網(wǎng)站設(shè)計(jì)企業(yè)網(wǎng)站的推廣階段
目錄
1. 什么是秒殺?
2. 秒殺系統(tǒng)的特點(diǎn)
3. 如何設(shè)計(jì)秒殺系統(tǒng)?
3.1 前端秒殺設(shè)計(jì)
3.2 后端秒殺設(shè)計(jì)
4. 如何保證不超賣?
4.1 庫(kù)存扣減方式
4.2 服務(wù)端庫(kù)存處理
5. 總結(jié)
* 知識(shí)擴(kuò)展:什么是CDN?
1. 什么是秒殺?
所謂秒殺,就是在同一個(gè)時(shí)刻有大量的客戶端請(qǐng)求爭(zhēng)搶同一個(gè)商品并完成交易的過程,瞬時(shí)會(huì)產(chǎn)生大量的并發(fā)讀和并發(fā)寫。
秒殺系統(tǒng)本質(zhì)上就是一個(gè)滿足高并發(fā)、高性能和高可用的分布式系統(tǒng),下面給出一張下單交互概要圖:
2. 秒殺系統(tǒng)的特點(diǎn)
高性能
秒殺涉及大量的并發(fā)讀和并發(fā)寫,因此秒系統(tǒng)必須能支持高并發(fā)訪問,而且RT(響應(yīng)時(shí)間)需要在一定的范圍內(nèi),通常是200ms
一致性
秒殺系統(tǒng)中通常會(huì)使用緩存,如何保證緩存和數(shù)據(jù)庫(kù)中庫(kù)存數(shù)據(jù)的一致性,保證商品庫(kù)存的準(zhǔn)確性
高可用
秒殺系統(tǒng)會(huì)在瞬間收到大量的讀寫操作,如何能保證服務(wù)能穩(wěn)定的運(yùn)行,設(shè)計(jì)系統(tǒng)時(shí)是否考慮到系統(tǒng)容災(zāi)問題,保證服務(wù)的高可用
可擴(kuò)展性
當(dāng)服務(wù)達(dá)到瓶頸時(shí),如何能實(shí)現(xiàn)快速擴(kuò)容。
?
3. 如何設(shè)計(jì)秒殺系統(tǒng)?
從在上述秒殺概要圖中,我們可以知道,整個(gè)秒殺流程需要從前端和后端2個(gè)核心部分進(jìn)行,因此我們就從這 2個(gè)部分來(lái)講解秒殺系統(tǒng)是如何設(shè)計(jì)的。
3.1 前端秒殺設(shè)計(jì)
服務(wù)高可用
前端是秒殺的入口,用戶首先是到前端界面進(jìn)行商品瀏覽,然后加購(gòu)自己想要的商品進(jìn)行下單付款操作。 所以,前端服務(wù)一定要保證高可用,要不然秒殺的入口都沒有了,談何秒殺。
頁(yè)面靜態(tài)化
前端數(shù)據(jù)源動(dòng)靜分離,靜態(tài)的數(shù)據(jù)可以放到CDN,前端從CDN獲取,動(dòng)態(tài)的數(shù)據(jù)放到服務(wù)器。 靜態(tài)數(shù)據(jù),比如商品的詳情信息,圖片等;動(dòng)態(tài)數(shù)據(jù),商品的數(shù)量,價(jià)格等。 比如:可以通過Url地址作為key來(lái)存儲(chǔ)靜態(tài)數(shù)據(jù)
控制對(duì)服務(wù)器請(qǐng)求的頻率
控制對(duì)服務(wù)器請(qǐng)求頻率能在一定程度上緩解服務(wù)器的壓力,限頻的方式有很多, 比如 秒殺按鈕點(diǎn)擊后置灰一定的時(shí)長(zhǎng)后才能再次點(diǎn)擊, 前端 答題正確后才向服務(wù)器發(fā)起請(qǐng)求,前端將請(qǐng)求加入隊(duì)列進(jìn)行排隊(duì),當(dāng)有多個(gè)秒殺活動(dòng)時(shí),可以分時(shí)段進(jìn)行,這些方式都是無(wú)損的。
控制對(duì)服務(wù)器請(qǐng)求參數(shù)的大小
因?yàn)槊霘⑵陂g,瞬時(shí)會(huì)有大量的請(qǐng)求涌向服務(wù)器,所以前端和服務(wù)器的數(shù)據(jù)交互要盡量的少,減少網(wǎng)絡(luò)傳輸以及編解碼的開銷。
限流,降級(jí)
當(dāng)下游服務(wù)器達(dá)到瓶頸時(shí),可以采用前端限流方式,降低對(duì)服務(wù)器的TPS和QPS。但是當(dāng)客戶端比較分散時(shí),限流閾值的設(shè)置是一個(gè)比較大的挑戰(zhàn):閾值設(shè)的太小,會(huì)導(dǎo)致服務(wù)端沒有達(dá)到瓶頸時(shí)客戶端已經(jīng)被限制;設(shè)的太大,則起不到限制的作用。
3.2 后端秒殺設(shè)計(jì)
服務(wù)高可用
后端是處理請(qǐng)求的核心服務(wù),所以必須做好高可用部署,容災(zāi)設(shè)計(jì)(異地多活)
降級(jí),限流,拒絕服務(wù)
降級(jí),就是當(dāng)系統(tǒng)的容量達(dá)到一定程度時(shí),限制或者關(guān)閉系統(tǒng)的某些非核心功能,從而把有限的資源保留給更核心的業(yè)務(wù)。所以降級(jí)一般需要前后端配合執(zhí)行,可以通過開關(guān)系統(tǒng)來(lái)實(shí)現(xiàn)。比如: 當(dāng)QPS達(dá)到一個(gè)閾值時(shí),可是設(shè)置開關(guān),將原來(lái)分頁(yè)查50條數(shù)據(jù),變成查10條,減少一次交互的數(shù)據(jù)量。
限流,就是當(dāng)系統(tǒng)容量達(dá)到瓶頸時(shí),通過限制一部分流量來(lái)保護(hù)系統(tǒng),限流可以是接口級(jí)別,服務(wù)器級(jí)別,iP級(jí)別等等,此處的限流是有損操作,限流的閾值一般可以根據(jù)壓測(cè)結(jié)果來(lái)設(shè)置
直接拒絕服務(wù),如果限流還不能解決問題,那就直接拒絕服務(wù)以求自保,這也是最差的一種兜底情況。
獨(dú)立部署秒殺服務(wù)
秒殺系統(tǒng)和普通的售賣有一定的差異點(diǎn),秒殺一般是持續(xù)時(shí)間短,并發(fā)量高,所以為了不影響正常的售賣,可以單獨(dú)部署一套秒殺服務(wù),在物理級(jí)別進(jìn)行隔離,也適合服務(wù)端靈活伸縮容以及做一些特殊的個(gè)性化處理。 有條件的團(tuán)隊(duì)可以實(shí)施。
流量削峰
當(dāng)服務(wù)流量過大時(shí),可以將請(qǐng)求存入MQ消息中間件進(jìn)行削峰處理,客戶端可以采用輪詢的方式向服務(wù)器獲取結(jié)果(服務(wù)器會(huì)受到很多結(jié)果查詢的請(qǐng)求),或者服務(wù)主動(dòng)push結(jié)果給客戶端(服務(wù)需要保留很多和客戶端的長(zhǎng)鏈接),2種方式各有優(yōu)劣,一般生產(chǎn)上輪詢查詢結(jié)果用的比較多。
熱點(diǎn)數(shù)據(jù)探測(cè)
很多時(shí)候,一個(gè)商品不屬于秒殺,但是很多用戶購(gòu)買,可能會(huì)成為熱點(diǎn)數(shù)據(jù),請(qǐng)求量不亞于秒殺,所以網(wǎng)關(guān)需要有熱點(diǎn)數(shù)據(jù)探測(cè)的功能,實(shí)現(xiàn)的方式有很多,比如:統(tǒng)計(jì)客戶端的請(qǐng)求數(shù)
增加緩存
秒殺一般遵從讀多寫少的28法則,所以可以在服務(wù)端增加緩存應(yīng)對(duì)高并發(fā)讀。緩存可以設(shè)置2層,第一層是本地緩存,可以使用Google guava的緩存框架,失效時(shí)間一般可以秒級(jí)別,本地緩存是屬于jvm級(jí)別的,每次失效后可以從redis緩存中加載,redis緩存要特別注意緩存失效,緩存擊穿,緩存雪崩的問題。
緩存擊穿:緩存中不存在,數(shù)據(jù)庫(kù)存在,這樣就會(huì)導(dǎo)致請(qǐng)求直接到達(dá)數(shù)據(jù)庫(kù),當(dāng)請(qǐng)求量比較大時(shí),可能直接把數(shù)據(jù)庫(kù)打垮。解決方法:
-
可以考慮緩存永遠(yuǎn)不過期
-
同步返回null,異步加鎖查詢數(shù)據(jù)庫(kù),更新緩存
緩存穿透:請(qǐng)求的數(shù)據(jù)在緩存和數(shù)據(jù)庫(kù)中都不存在,解決辦法:
-
業(yè)務(wù)層進(jìn)行合法校驗(yàn),攔截大部分不合法的請(qǐng)求
-
使用布隆過濾器,針對(duì)一個(gè)或者多個(gè)維度,把可能存在的數(shù)據(jù)值hash到bitmap中,bitmap中不存在則該數(shù)據(jù)一定不存在,bitmap中存該數(shù)據(jù)可能存在
-
對(duì)空的結(jié)果進(jìn)行緩存,設(shè)置得較短過期時(shí)間,當(dāng)有數(shù)據(jù)庫(kù)變更時(shí),必須同時(shí)刷新緩存,否則會(huì)導(dǎo)致不一致的問題存在
緩存雪崩:指緩存在同一時(shí)刻失效,請(qǐng)求都到數(shù)據(jù)庫(kù)上,解決的辦法:
-
可以考慮緩存永遠(yuǎn)不過期
-
失效時(shí)間盡量隨機(jī),避免同時(shí)過期
-
多級(jí)緩存,數(shù)據(jù)緩存到A和B,A設(shè)置過期時(shí)間,B不設(shè)置過期時(shí)間,如果A為空的時(shí)候去讀B,同時(shí)異步去更新緩存,需要同時(shí)更新兩個(gè)緩存
4. 如何保證不超賣?
4.1 庫(kù)存扣減方式
下單減庫(kù)存:買家下單后,扣減商品總庫(kù)存。下單減庫(kù)存是最簡(jiǎn)單也是控制最精確的一種,下單時(shí)直接通過數(shù)據(jù)庫(kù)的事務(wù)機(jī)制控制商品庫(kù)存,一定不會(huì)出現(xiàn)超賣的情況。出現(xiàn)的問題: 惡意刷單,某些人下單后占用庫(kù)存不付款。
付款減庫(kù)存:買家付款之后,扣減商品總庫(kù)存。這種方式產(chǎn)生的問題是,庫(kù)存超賣。
預(yù)扣庫(kù)存:買家下單后,預(yù)扣庫(kù)存,在一定的時(shí)間內(nèi)未付款,庫(kù)存將會(huì)自動(dòng)釋放。在買家付款前,需再次校驗(yàn)庫(kù)存是否保留,如果沒有保留,則再次嘗試預(yù)扣;如果庫(kù)存不足則不允許繼續(xù)付款;如果預(yù)扣成功,則完成付款并實(shí)際地減去庫(kù)存。這種方式在生產(chǎn)上用的比較多。
4.2 服務(wù)端庫(kù)存處理
將庫(kù)存操作的邏輯放到lua腳本中,通過redis的單線程特性,保證Lua腳本執(zhí)行不會(huì)被打斷,從而保證庫(kù)存操作的原子性
5. 總結(jié)
下面給出一張秒殺系統(tǒng)常用的架構(gòu)圖,百種業(yè)務(wù)百種架構(gòu),一個(gè)秒殺系統(tǒng)看似簡(jiǎn)單,其實(shí)包含了很多架構(gòu)的思想,從前端到后端,怎么全局把控,對(duì)于各個(gè)服務(wù)怎么去做高可用,高性能,可擴(kuò)展保證。如何設(shè)計(jì)緩存,如何保證緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,服務(wù)達(dá)到瓶頸時(shí),如何做服務(wù)降級(jí),限流。
一般我們遵從幾個(gè)原則:
-
前后端交互的數(shù)據(jù)盡量少
-
前端盡量控制對(duì)后端的無(wú)效請(qǐng)求
-
服務(wù)之間的依賴盡量少
-
請(qǐng)求路徑盡量短
-
服務(wù)或者中間件不要有單點(diǎn),要有容災(zāi)
* 知識(shí)擴(kuò)展:什么是CDN?
CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))是一種通過分布式服務(wù)器網(wǎng)絡(luò)加速內(nèi)容傳輸?shù)募夹g(shù)。它通過將靜態(tài)資源(如HTML、CSS、JavaScript、圖片、視頻等)緩存到全球多個(gè)節(jié)點(diǎn)服務(wù)器上,使用戶可以從離自己最近的節(jié)點(diǎn)獲取資源,從而提升加載速度和性能。
前端CDN的主要作用:
加速資源加載:用戶從最近的節(jié)點(diǎn)獲取資源,減少延遲。
減輕服務(wù)器負(fù)擔(dān):CDN分擔(dān)流量,降低源服務(wù)器壓力。
提升可用性:即使某個(gè)節(jié)點(diǎn)故障,其他節(jié)點(diǎn)仍可提供服務(wù)。
節(jié)省帶寬:通過緩存減少重復(fù)請(qǐng)求,降低帶寬消耗
常見的前端CDN服務(wù):
jsDelivr:免費(fèi)CDN,支持開源項(xiàng)目。
Cloudflare:提供安全防護(hù)和性能優(yōu)化。
Akamai:全球最大CDN之一,適合大型企業(yè)。
AWS CloudFront:亞馬遜的CDN服務(wù),與AWS生態(tài)系統(tǒng)集成。
Google Cloud CDN:谷歌的CDN服務(wù),與Google Cloud集成。
簡(jiǎn)單來(lái)說,前端CDN通過分布式緩存和就近訪問,顯著提升網(wǎng)站性能,改善用戶體驗(yàn),同時(shí)減輕服務(wù)器壓力。
🌸🌸🌸?完結(jié)撒花?🌸🌸🌸
??博主WX:g2279605572? ?歡迎大家與我交流!?
?