寫在前面
很多小伙伴反饋說(shuō),高并發(fā)專題學(xué)了那么久,但是,在真正做項(xiàng)目時(shí),仍然不知道如何下手處理高并發(fā)業(yè)務(wù)場(chǎng)景!甚至很多小伙伴仍然停留在只是簡(jiǎn)單的提供接口(CRUD)階段,不知道學(xué)習(xí)的并發(fā)知識(shí)如何運(yùn)用到實(shí)際項(xiàng)目中,就更別提如何構(gòu)建高并發(fā)系統(tǒng)了!
究竟什么樣的系統(tǒng)算是高并發(fā)系統(tǒng)?今天,我們就一起解密高并發(fā)業(yè)務(wù)場(chǎng)景下典型的秒殺系統(tǒng)的架構(gòu),結(jié)合高并發(fā)專題下的其他文章,學(xué)以致用。
這邊還有各個(gè)知識(shí)點(diǎn)模塊整理文檔和更多大廠面試真題,有需要的朋友可以加q群:1103806531? 備注:簡(jiǎn)書? ?免費(fèi)領(lǐng)取~
電商系統(tǒng)架構(gòu)
在電商領(lǐng)域,存在著典型的秒殺業(yè)務(wù)場(chǎng)景,那何謂秒殺場(chǎng)景呢。簡(jiǎn)單的來(lái)說(shuō)就是一件商品的購(gòu)買人數(shù)遠(yuǎn)遠(yuǎn)大于這件商品的庫(kù)存,而且這件商品在很短的時(shí)間內(nèi)就會(huì)被搶購(gòu)一空。 比如每年的618、雙11大促,小米新品促銷等業(yè)務(wù)場(chǎng)景,就是典型的秒殺業(yè)務(wù)場(chǎng)景。
我們可以將電商系統(tǒng)的架構(gòu)簡(jiǎn)化成下圖所示。
由圖所示,我們可以簡(jiǎn)單的將電商系統(tǒng)的核心層分為:負(fù)載均衡層、應(yīng)用層和持久層。接下來(lái),我們就預(yù)估下每一層的并發(fā)量。
假如負(fù)載均衡層使用的是高性能的Nginx,則我們可以預(yù)估Nginx最大的并發(fā)度為:10W+,這里是以萬(wàn)為單位。
假設(shè)應(yīng)用層我們使用的是Tomcat,而Tomcat的最大并發(fā)度可以預(yù)估為800左右,這里是以百為單位。
假設(shè)持久層的緩存使用的是Redis,數(shù)據(jù)庫(kù)使用的是MySQL,MySQL的最大并發(fā)度可以預(yù)估為1000左右,以千為單位。Redis的最大并發(fā)度可以預(yù)估為5W左右,以萬(wàn)為單位。
所以,負(fù)載均衡層、應(yīng)用層和持久層各自的并發(fā)度是不同的,那么,為了提升系統(tǒng)的總體并發(fā)度和緩存,我們通常可以采取哪些方案呢?
(1)系統(tǒng)擴(kuò)容
系統(tǒng)擴(kuò)容包括垂直擴(kuò)容和水平擴(kuò)容,增加設(shè)備和機(jī)器配置,絕大多數(shù)的場(chǎng)景有效。
(2)緩存
本地緩存或者集中式緩存,減少網(wǎng)絡(luò)IO,基于內(nèi)存讀取數(shù)據(jù)。大部分場(chǎng)景有效。
(3)讀寫分離
采用讀寫分離,分而治之,增加機(jī)器的并行處理能力。
秒殺系統(tǒng)的特點(diǎn)
秒殺系統(tǒng)的業(yè)務(wù)特點(diǎn)
秒殺系統(tǒng)的技術(shù)特點(diǎn)
由于篇幅有限,這一部分省略,需要完整版的朋友可以加q群:1103806531? 備注:簡(jiǎn)書? ?免費(fèi)領(lǐng)取~
秒殺三階段
通常,從秒殺開始到結(jié)束,往往會(huì)經(jīng)歷三個(gè)階段:
準(zhǔn)備階段:這個(gè)階段也叫作系統(tǒng)預(yù)熱階段,此時(shí)會(huì)提前預(yù)熱秒殺系統(tǒng)的業(yè)務(wù)數(shù)據(jù),往往這個(gè)時(shí)候,用戶會(huì)不斷刷新秒殺頁(yè)面,來(lái)查看秒殺活動(dòng)是否已經(jīng)開始。在一定程度上,通過(guò)用戶不斷刷新頁(yè)面的操作,可以將一些數(shù)據(jù)存儲(chǔ)到Redis中進(jìn)行預(yù)熱。
秒殺階段:這個(gè)階段主要是秒殺活動(dòng)的過(guò)程,會(huì)產(chǎn)生瞬時(shí)的高并發(fā)流量,對(duì)系統(tǒng)資源會(huì)造成巨大的沖擊,所以,在秒殺階段一定要做好系統(tǒng)防護(hù)。
結(jié)算階段: 完成秒殺后的數(shù)據(jù)處理工作,比如數(shù)據(jù)的一致性問(wèn)題處理,異常情況處理,商品的回倉(cāng)處理等。
針對(duì)這種短時(shí)間內(nèi)大流量的系統(tǒng)來(lái)說(shuō),就不太適合使用系統(tǒng)擴(kuò)容了,因?yàn)榧词瓜到y(tǒng)擴(kuò)容了,也就是在很短的時(shí)間內(nèi)會(huì)使用到擴(kuò)容后的系統(tǒng),大部分時(shí)間內(nèi),系統(tǒng)無(wú)需擴(kuò)容即可正常訪問(wèn)。 那么,我們可以采取哪些方案來(lái)提升系統(tǒng)的秒殺性能呢?
秒殺系統(tǒng)方案
針對(duì)秒殺系統(tǒng)的特點(diǎn),我們可以采取如下的措施來(lái)提升系統(tǒng)的性能。
(1)異步解耦
將整體流程進(jìn)行拆解,核心流程通過(guò)隊(duì)列方式進(jìn)行控制。
(2)限流防刷
控制網(wǎng)站整體流量,提高請(qǐng)求的門檻,避免系統(tǒng)資源耗盡。
(3)資源控制
將整體流程中的資源調(diào)度進(jìn)行控制,揚(yáng)長(zhǎng)避短。
由于應(yīng)用層能夠承載的并發(fā)量比緩存的并發(fā)量少很多。所以,在高并發(fā)系統(tǒng)中,我們可以直接使用OpenResty由負(fù)載均衡層訪問(wèn)緩存,避免了調(diào)用應(yīng)用層的性能損耗。 同時(shí),由于秒殺系統(tǒng)中,商品數(shù)量比較少,我們也可以使用動(dòng)態(tài)渲染技術(shù),CDN技術(shù)來(lái)加速網(wǎng)站的訪問(wèn)性能。
如果在秒殺活動(dòng)開始時(shí),并發(fā)量太高時(shí),我們可以將用戶的請(qǐng)求放入隊(duì)列中進(jìn)行處理,并為用戶彈出排隊(duì)頁(yè)面。
秒殺系統(tǒng)時(shí)序圖
網(wǎng)上很多的秒殺系統(tǒng)和對(duì)秒殺系統(tǒng)的解決方案,并不是真正的秒殺系統(tǒng),他們采用的只是同步處理請(qǐng)求的方案,一旦并發(fā)量真的上來(lái)了,他們所謂的秒殺系統(tǒng)的性能會(huì)急劇下降。我們先來(lái)看一下秒殺系統(tǒng)在同步下單時(shí)的時(shí)序圖。
同步下單流程
1.用戶發(fā)起秒殺請(qǐng)求
在同步下單流程中,首先,用戶發(fā)起秒殺請(qǐng)求。商城服務(wù)需要依次執(zhí)行如下流程來(lái)處理秒殺請(qǐng)求的業(yè)務(wù)。
(1)識(shí)別驗(yàn)證碼是否正確
商城服務(wù)判斷用戶發(fā)起秒殺請(qǐng)求時(shí)提交的驗(yàn)證碼是否正確。
(2)判斷活動(dòng)是否已經(jīng)結(jié)束
驗(yàn)證當(dāng)前秒殺活動(dòng)是否已經(jīng)結(jié)束。
(3)驗(yàn)證訪問(wèn)請(qǐng)求是否處于黑名單
在電商領(lǐng)域中,存在著很多的惡意競(jìng)爭(zhēng),也就是說(shuō),其他商家可能會(huì)通過(guò)不正當(dāng)手段來(lái)惡意請(qǐng)求秒殺系統(tǒng),占用系統(tǒng)大量的帶寬和其他系統(tǒng)資源。此時(shí),就需要使用風(fēng)控系統(tǒng)等實(shí)現(xiàn)黑名單機(jī)制。為了簡(jiǎn)單,也可以使用攔截器統(tǒng)計(jì)訪問(wèn)頻次實(shí)現(xiàn)黑名單機(jī)制。
(4)驗(yàn)證真實(shí)庫(kù)存是否足夠
系統(tǒng)需要驗(yàn)證商品的真實(shí)庫(kù)存是否足夠,是否能夠支持本次秒殺活動(dòng)的商品庫(kù)存量。
(5)扣減緩存中的庫(kù)存
在秒殺業(yè)務(wù)中,往往會(huì)將商品庫(kù)存等信息存放在緩存中,此時(shí),還需要驗(yàn)證秒殺活動(dòng)使用的商品庫(kù)存是否足夠,并且需要扣減秒殺活動(dòng)的商品庫(kù)存數(shù)量。
(6)計(jì)算秒殺的價(jià)格
由于在秒殺活動(dòng)中,商品的秒殺價(jià)格和商品的真實(shí)價(jià)格存在差異,所以,需要計(jì)算商品的秒殺價(jià)格。
注意:如果在秒殺場(chǎng)景中,系統(tǒng)涉及的業(yè)務(wù)更加復(fù)雜的話,會(huì)涉及更多的業(yè)務(wù)操作,這里,我只是列舉出一些常見的業(yè)務(wù)操作。
2.提交訂單
(1)訂單入口
將用戶提交的訂單信息保存到數(shù)據(jù)庫(kù)中。
(2)扣減真實(shí)庫(kù)存
訂單入庫(kù)后,需要在商品的真實(shí)庫(kù)存中將本次成功下單的商品數(shù)量扣除。
如果我們使用上述流程開發(fā)了一個(gè)秒殺系統(tǒng),當(dāng)用戶發(fā)起秒殺請(qǐng)求時(shí),由于系統(tǒng)每個(gè)業(yè)務(wù)流程都是串行執(zhí)行的,整體上系統(tǒng)的性能不會(huì)太高,當(dāng)并發(fā)量太高時(shí),我們會(huì)為用戶彈出下面的排隊(duì)頁(yè)面,來(lái)提示用戶進(jìn)行等待。
由于時(shí)間關(guān)系,沒(méi)有寫的很詳細(xì),有需要完整版的朋友可以加q群:1103806531? 備注:簡(jiǎn)書? ?免費(fèi)領(lǐng)取~
高并發(fā)“黑科技”與致勝奇招
假設(shè),在秒殺系統(tǒng)中我們使用Redis實(shí)現(xiàn)緩存,假設(shè)Redis的讀寫并發(fā)量在5萬(wàn)左右。我們的商城秒殺業(yè)務(wù)需要支持的并發(fā)量在100萬(wàn)左右。如果這100萬(wàn)的并發(fā)全部打入Redis中,Redis很可能就會(huì)掛掉,那么,我們?nèi)绾谓鉀Q這個(gè)問(wèn)題呢?
留下這個(gè)問(wèn)題,歡迎大家在評(píng)論區(qū)交流~