03 系統(tǒng)面臨的現(xiàn)實(shí)問(wèn)題:下訂單的同時(shí)還要發(fā)券、發(fā)紅包、Push推送,性能太差!

系統(tǒng)面臨的現(xiàn)實(shí)問(wèn)題:下訂單同時(shí)還要發(fā)券、發(fā)紅包、Push推送,性能太差
正文開(kāi)始:
1、明哥的突擊考驗(yàn):說(shuō)說(shuō)昨天講的訂單系統(tǒng)架構(gòu)
今天小猛來(lái)上班之后,明哥立馬就把他叫到了一個(gè)小會(huì)議室里,打算給他講講訂單系統(tǒng)當(dāng)前面臨的技術(shù)難點(diǎn),這些技術(shù)難點(diǎn)就是訂單系統(tǒng)當(dāng)前最最亟需解決的一些問(wèn)題
因此到會(huì)議室里以后,明哥首先把之前講過(guò)的訂單系統(tǒng)整體架構(gòu)和流程快速的在小白板上重新畫了出來(lái)。
明哥說(shuō):小猛,你看我下面畫的這個(gè)圖,先簡(jiǎn)單回顧一下,然后你來(lái)復(fù)述一遍訂單系統(tǒng)的整體架構(gòu)和流程,我看看你忘了沒(méi)有。
? ? ? ? ? ?

? ? ? ? ? ??
2、一個(gè)認(rèn)真總結(jié)做筆記的小猛
小猛看著明哥畫出來(lái)的這個(gè)圖,非常有信心的開(kāi)始復(fù)述,心想:我可是昨晚復(fù)習(xí)和總結(jié)了一晚上筆記,把老大昨天說(shuō)的都給吸收了。
小猛:首先,訂單系統(tǒng)必須得有一個(gè)下單模塊負(fù)責(zé)讓用戶進(jìn)行下訂單
其次當(dāng)訂單創(chuàng)建好之后,就必須要跳轉(zhuǎn)到第三方支付的界面上去,讓用戶盡快支付。如果用戶支付成功了,然后就會(huì)回調(diào)訂單系統(tǒng)的接口。
接著訂單系統(tǒng)會(huì)去做一些事情,比如扣減商品的庫(kù)存,更新訂單的狀態(tài),給用戶發(fā)券、發(fā)貨紅包或者積分,給用戶發(fā)送Push去推送訂單已經(jīng)支付等待出庫(kù)的通知。
接著用戶就可以從訂單系統(tǒng)的查詢模塊去檢索自己的訂單,此時(shí)可以做一些非核心的業(yè)務(wù)流程
比較常見(jiàn)的有:選擇對(duì)商品進(jìn)行退貨、查詢訂單的物流狀態(tài)、或者之前沒(méi)來(lái)得及支付現(xiàn)在對(duì)訂單進(jìn)行支付,等等。
最后訂單系統(tǒng)需要提供一個(gè)大促模塊,專門去抗雙11、雙12、618、秒殺活動(dòng)等特殊大促活動(dòng)時(shí)的瞬時(shí)超高并發(fā),這個(gè)必須跟正常的下單流程區(qū)分開(kāi)來(lái)。
另外還可能有其他兄弟團(tuán)隊(duì)要來(lái)獲取訂單系統(tǒng)的數(shù)據(jù),比如大數(shù)據(jù)團(tuán)隊(duì)。
而當(dāng)前咱們的APP大致是千萬(wàn)注冊(cè)用戶,百萬(wàn)日活,每日幾十萬(wàn)訂單量,每天高峰期訪問(wèn)每秒兩三千的QPS,大致整體負(fù)載壓力是這樣。
現(xiàn)在系統(tǒng)架構(gòu)比較簡(jiǎn)單,主要是一套訂單系統(tǒng)部署了多臺(tái)機(jī)器,做了一個(gè)集群,然后底層就連一臺(tái)數(shù)據(jù)庫(kù)。
現(xiàn)在的問(wèn)題就是,隨著用戶量越來(lái)越大,數(shù)據(jù)量會(huì)越來(lái)越大,高峰期并發(fā)量也會(huì)越來(lái)越高,系統(tǒng)的壓力越來(lái)越大,光靠這個(gè)架構(gòu)抗是很困難的,亟需對(duì)訂單系統(tǒng)整體進(jìn)行架構(gòu)的升級(jí)和改造。
小猛行云流水般說(shuō)完了訂單系統(tǒng)的整體架構(gòu)和核心的業(yè)務(wù)流程,還有當(dāng)前面臨的負(fù)載壓力以及技術(shù)上的挑戰(zhàn),可見(jiàn)這孩子真是對(duì)項(xiàng)目下了功夫,用了心了。
明哥聽(tīng)了連連點(diǎn)頭,非常滿意,這小伙子是個(gè)好苗子,自己得好好帶,盡快培養(yǎng)成骨干工程師。
3、小猛的疑惑:系統(tǒng)壓力越來(lái)越大到底指的是什么意思?
但是雖然小猛快速解釋清楚了明哥昨天灌輸給他的這一套項(xiàng)目背景之后,小猛自己卻有一個(gè)很大的疑惑,他有點(diǎn)不理解一個(gè)事情。
小猛問(wèn):明哥,你昨天最后老是不停的強(qiáng)調(diào),我們的系統(tǒng)壓力越來(lái)越大,但是我始終沒(méi)搞明白,系統(tǒng)壓力大到底是大在哪兒?這是什么意思?。课易蛲硐肓税胩煲矝](méi)搞明白。
明哥說(shuō):放心,這個(gè)系統(tǒng)壓力大的概念,對(duì)很多初入職場(chǎng)的小伙子,或者是很多工作多年但是一直在做那種幾十個(gè)人、幾百個(gè)人用的內(nèi)部系統(tǒng)的工程師,都是一個(gè)疑惑
因?yàn)闆](méi)親身經(jīng)歷過(guò)一些壓力大的系統(tǒng),是很難真正透徹的理解這個(gè)東西的。
于是明哥打算先給小猛從整體上解釋一下這個(gè)問(wèn)題。
明哥:昨天我們已經(jīng)說(shuō)過(guò)了,這個(gè)系統(tǒng)每天高峰期大概會(huì)有2000左右的QPS,也就是每秒會(huì)有2000左右的請(qǐng)求過(guò)來(lái),這就是當(dāng)前系統(tǒng)的一個(gè)最大壓力。
在非高峰的時(shí)候,其實(shí)遠(yuǎn)遠(yuǎn)達(dá)不到這么高的并發(fā),所以先考慮高峰期的壓力就可以了。
說(shuō)著,明哥在下面的圖里畫了一個(gè)紅圈,“我們先講講這里的事兒,你得先搞明白系統(tǒng)的壓力是從哪兒來(lái)的?”
? ? ? ? ? ?

?? ? ? ??
4、明哥原來(lái)是個(gè)老司機(jī):從早上的一個(gè)煎餅說(shuō)起
現(xiàn)在經(jīng)過(guò)統(tǒng)計(jì),我們這個(gè)電商APP大概是每天百萬(wàn)的用戶在使用,但是你要知道一點(diǎn),用戶對(duì)任何一個(gè)APP的使用時(shí)間,都是根據(jù)APP的類型不同而有區(qū)別的。
比如你要用一個(gè)電商APP,那么本質(zhì)是一種很放松的購(gòu)物,可能是有什么東西需要買,立馬掏出手機(jī)來(lái)買,也可能是沒(méi)事兒干,跟逛街一樣,就想逛一逛APP。
那么你作為一個(gè)正常的人思考一下,平時(shí)早上你剛起床,匆匆忙忙洗臉?biāo)⒀?,然后出門在路上買個(gè)煎餅吃早飯,這個(gè)過(guò)程中你會(huì)逛一個(gè)電商APP嗎?
恐怕不會(huì)!
接下來(lái)呢,你會(huì)健步如飛的去趕地鐵,或者坐公交車,在這個(gè)過(guò)程中人擠人,你覺(jué)得你會(huì)玩兒電商APP嗎?
恐怕也不會(huì)!
接著到了公司之后,就開(kāi)始了一天的工作,在工作過(guò)程中如果你逛電商APP,那你可能是不打算繼續(xù)干了。
所以為了保住你的飯碗,這個(gè)時(shí)候還是別逛了。
然后好不容易干到中午,大家吃完午飯開(kāi)始午休,有的人刷抖音,有的人玩王者榮耀,你也許會(huì)打開(kāi)手機(jī)逛一逛電商APP,這是有一定概率的。
但是如果你是一個(gè)合格的職場(chǎng)員工,上午干的很累,下午還有工作壓力,中午也不敢放松太多,中午應(yīng)該不會(huì)逛太多的時(shí)間。
下午繼續(xù)工作,最后好不容易下班了,接著坐地鐵或班車回家的時(shí)候,這個(gè)過(guò)程中往往是每個(gè)職場(chǎng)人一天最輕松的時(shí)刻
包括到家了以后,睡覺(jué)前,每個(gè)人都會(huì)適當(dāng)放松一會(huì)兒,無(wú)論是玩游戲,還是逛電商APP,適當(dāng)買點(diǎn)自己喜歡的東西給自己減減壓。
明哥說(shuō)到這里停頓了一下,問(wèn):小明,你覺(jué)得我說(shuō)的這些是跟技術(shù)無(wú)關(guān)的東西嗎?
小猛停頓了一下,說(shuō):明哥,一開(kāi)始我很疑惑你為什么扯這么遠(yuǎn),不過(guò)突然發(fā)現(xiàn)你說(shuō)的這些好像對(duì)一個(gè)系統(tǒng)的工程師來(lái)說(shuō),確實(shí)是第一件應(yīng)該了解的事情,也就是你的APP用戶的生活習(xí)慣和APP的使用習(xí)慣。
這些用戶的使用習(xí)慣直接決定了他們使用我們APP的頻率、時(shí)間段和時(shí)長(zhǎng),一般每隔幾天用一次我們的APP?每次使用一般在什么時(shí)間段?每次使用多長(zhǎng)時(shí)間?
這些東西都要通過(guò)對(duì)用戶的分析得出來(lái)。
明哥很滿意的點(diǎn)點(diǎn)頭:不錯(cuò),你的反應(yīng)真的很快,當(dāng)時(shí)校招就覺(jué)得你比一般學(xué)生反應(yīng)快很多,思維更加敏捷。一個(gè)工程師不能光是埋頭于技術(shù),視野要打開(kāi)一些,思維要更加多元化,當(dāng)時(shí)果然沒(méi)選錯(cuò)你!
5、根據(jù)線上統(tǒng)計(jì)數(shù)據(jù)推算出系統(tǒng)的負(fù)載
喝了口水,明哥繼續(xù)道:既然搞明白了用戶的生活習(xí)慣,我們就可以結(jié)合線上的一些統(tǒng)計(jì)數(shù)據(jù)來(lái)推算一下系統(tǒng)的工作負(fù)載了。
通過(guò)線上一些數(shù)據(jù)的統(tǒng)計(jì),我們大致知道,咱們這個(gè)APP,基本上80%的用戶都習(xí)慣于在晚上六點(diǎn)過(guò)后到凌晨十一點(diǎn)這幾個(gè)小時(shí)使用,這個(gè)剛好是大家下班的時(shí)間,便于大家購(gòu)物。
所以在這幾個(gè)小時(shí)內(nèi),可以認(rèn)為有80萬(wàn)左右的用戶會(huì)使用APP。
然后由于我們是一個(gè)電商的APP,需要用戶大量的瀏覽商品,搜索商品,然后才會(huì)下訂單和支付訂單,所以用戶一般會(huì)對(duì)APP的界面執(zhí)行幾十次到上百次的點(diǎn)擊。
但是大部分點(diǎn)擊都是跟一些商品系統(tǒng)、評(píng)論系統(tǒng)進(jìn)行的交互,用戶主要是查看商品,查看一些評(píng)價(jià),還不是針對(duì)訂單系統(tǒng)的。
因此對(duì)我們訂單系統(tǒng)而言,主要的訪問(wèn)量就是下訂單以及對(duì)訂單的檢索、查詢,少量的退款等操作。
我們現(xiàn)在每天大概是三五十萬(wàn)個(gè)訂單,也就對(duì)應(yīng)了百萬(wàn)次下單操作和一些訂單查詢等操作
看著百萬(wàn)次針對(duì)訂單系統(tǒng)的請(qǐng)求似乎很多,但是如果均攤到5個(gè)小時(shí)中呢?每秒鐘大概只有幾十次請(qǐng)求而已!
但是如果你要這么計(jì)算,那就大錯(cuò)特錯(cuò)了
因?yàn)槲覀兊碾娚藺PP有兩個(gè)特點(diǎn),第一,真實(shí)的系統(tǒng)訪問(wèn)負(fù)載應(yīng)該是一個(gè)半圓形的曲線,類似下面這樣:
? ? ? ? ? ?

? ? ? ? ??
比如從晚上6點(diǎn)開(kāi)始訪問(wèn)量開(kāi)始增加,一直到可能晚上八九點(diǎn)到一個(gè)頂點(diǎn),訪問(wèn)是最大的,然后慢慢的開(kāi)始下落,到晚上十一點(diǎn)就變得較低。
所以在看系統(tǒng)的訪問(wèn)壓力的時(shí)候,是不能直接按平均值來(lái)計(jì)算的。
另外,這個(gè)電商APP有一個(gè)特點(diǎn),每天都有一些限時(shí)限量售賣的特價(jià)商品,就是每天會(huì)有一批特價(jià)商品是限量的,而且限制在晚上某個(gè)時(shí)間點(diǎn)售賣
因此往往在這段時(shí)間里,會(huì)有很多用戶在等著到了那個(gè)時(shí)間就一下子點(diǎn)擊購(gòu)買下單,此時(shí)訂單系統(tǒng)的壓力往往是最大的。
綜合下來(lái)而言,根據(jù)線上系統(tǒng)的接口統(tǒng)計(jì)數(shù)據(jù)來(lái)看,晚上購(gòu)物最活躍的時(shí)候,訂單系統(tǒng)下單最頂點(diǎn)的高峰時(shí)段每秒會(huì)有超過(guò)2000的請(qǐng)求,這就是訂單系統(tǒng)的最高負(fù)載。其他時(shí)候都比這個(gè)負(fù)載會(huì)低不少。
6、明哥終極解惑:為什么系統(tǒng)的壓力會(huì)越來(lái)越大?
聽(tīng)到這里,小猛還是沒(méi)有明白,那么為什么系統(tǒng)的壓力會(huì)越來(lái)越大?
小猛說(shuō):我現(xiàn)在完全可以理解我們訂單系統(tǒng)的高峰期的負(fù)載是怎么來(lái)的了,但是系統(tǒng)的壓力到底是指的是什么?
小猛對(duì)明哥再次提出了疑問(wèn)。
明哥說(shuō):別著急,因?yàn)槟銓?duì)互聯(lián)網(wǎng)類的系統(tǒng)肯定有很多地方都不熟悉,對(duì)互聯(lián)網(wǎng)系統(tǒng)的思考和一些類似OA、CRM之類的傳統(tǒng)軟件系統(tǒng)是完全不一樣的,要習(xí)慣互聯(lián)網(wǎng)系統(tǒng)的分析方式。
明哥繼續(xù)道:你看,現(xiàn)在線上的訂單系統(tǒng)一共部署了8臺(tái)機(jī)器,每臺(tái)機(jī)器的配置是4核8G,這是互聯(lián)網(wǎng)公司的標(biāo)準(zhǔn)配置,當(dāng)然也有不少系統(tǒng)是用2核4G的機(jī)器部署的,那也是標(biāo)準(zhǔn)配置。
因此高峰期每臺(tái)機(jī)器的請(qǐng)求大概是每秒200~300之間。
明哥一邊說(shuō)著,一邊畫出了下面的圖。
? ? ? ? ? ?

?? ? ? ? ? ?
但是這8臺(tái)訂單系統(tǒng)部署的服務(wù)器都是連接一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的,數(shù)據(jù)庫(kù)服務(wù)器的配置是16核32G,而且是SSD固態(tài)硬盤的,用的是比較高配置比較貴的機(jī)器,因此性能會(huì)更好一些。
這也是比較常規(guī)的數(shù)據(jù)庫(kù)服務(wù)器的配置,但是一般也會(huì)用比如8核16G和機(jī)械硬盤等機(jī)器部署數(shù)據(jù)庫(kù)。
說(shuō)著,明哥又在下面的圖中補(bǔ)充了一個(gè)數(shù)據(jù)庫(kù)服務(wù)器進(jìn)去。
? ? ? ? ? ?

?? ? ? ? ? ?
現(xiàn)在線上這樣的一個(gè)機(jī)器部署情況,在高峰期每秒2000以上請(qǐng)求的情況下是很輕松可以抗住的
因?yàn)?核8G的機(jī)器一般每秒鐘抗幾百請(qǐng)求都沒(méi)問(wèn)題,現(xiàn)在才每秒兩三百請(qǐng)求,CPU資源使用率都不超過(guò)50%。
可以說(shuō)8臺(tái)4核8G的機(jī)器,每臺(tái)機(jī)器每秒高峰期兩三百請(qǐng)求是很輕松的。
然后數(shù)據(jù)庫(kù)服務(wù)器因?yàn)橛玫氖?6核32G的配置,因此之前壓測(cè)的時(shí)候知道他即使每秒上萬(wàn)請(qǐng)求也能做到,只不過(guò)那個(gè)已經(jīng)是他的極限了,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器的CPU、磁盤、網(wǎng)絡(luò)、IO、內(nèi)存的使用率幾乎達(dá)到極限。
但是一般來(lái)說(shuō)在每秒四五千的請(qǐng)求的話,這樣的數(shù)據(jù)庫(kù)服務(wù)器是沒(méi)什么問(wèn)題的,何況經(jīng)過(guò)線上監(jiān)控統(tǒng)計(jì),現(xiàn)在數(shù)據(jù)庫(kù)服務(wù)器在高峰期的每秒請(qǐng)求量也就是三四千的樣子,因此基本上還沒(méi)什么大問(wèn)題。
所以明哥說(shuō)到這里,頓了一頓,看著小猛說(shuō):要明白什么是系統(tǒng)壓力,就得明白你的系統(tǒng)線上部署的機(jī)器情況和使用的數(shù)據(jù)庫(kù)的機(jī)器情況
而且作為一個(gè)合格的互聯(lián)網(wǎng)行業(yè)的Java工程師,要對(duì)各種機(jī)器配置大致能抗下的并發(fā)量有一個(gè)基本的了解。
小猛聽(tīng)到這里,簡(jiǎn)直是目瞪口呆,跟這種線上系統(tǒng)有真實(shí)負(fù)載和壓力的情況想比,自己上大學(xué)的時(shí)候在實(shí)驗(yàn)室里做的那種Demo小項(xiàng)目,簡(jiǎn)直完全不是一個(gè)概念。
仿佛在他面前打開(kāi)了一個(gè)新世界,真是太有意思了!
7、如果系統(tǒng)壓力越來(lái)越大會(huì)怎么樣?
這個(gè)時(shí)候小猛開(kāi)始有點(diǎn)找到門道了,他問(wèn)明哥:那么如果咱們的用戶量越來(lái)越大,并發(fā)量越來(lái)越大,數(shù)據(jù)量越來(lái)越大,這個(gè)系統(tǒng)會(huì)有什么問(wèn)題?
明哥笑笑說(shuō):那這里的問(wèn)題就真的很多了,一旦系統(tǒng)壓力越來(lái)越大,無(wú)論是并發(fā)量還是數(shù)據(jù)量,你會(huì)發(fā)現(xiàn)你的系統(tǒng)各個(gè)地方都要優(yōu)化,都有問(wèn)題,這不是一個(gè)人可以解決的,也不是一兩天就可以解決的。
一個(gè)高并發(fā)、大數(shù)據(jù)量的系統(tǒng)架構(gòu)迭代、演進(jìn)和優(yōu)化,需要一個(gè)精干的技術(shù)團(tuán)隊(duì)經(jīng)年累月的不停的去做,期間要涉及到大量的技術(shù)方案、架構(gòu)重構(gòu)。
但是今天最后的最重要的一個(gè)主題,就是先給你講一個(gè)現(xiàn)在系統(tǒng)最明顯的一個(gè)技術(shù)問(wèn)題,也是影響用戶體驗(yàn)的一個(gè)問(wèn)題。
現(xiàn)在我重新畫出來(lái)我們的訂單系統(tǒng)的一個(gè)業(yè)務(wù)流程圖,你看下面。
? ? ? ? ? ?

? ? ? ? ? ? ?
我們都知道,在用戶下訂單之后一般就是要支付,在支付成功之后我們要干很多的事情
在上面那個(gè)圖的第8個(gè)步驟里,其實(shí)我們除了發(fā)優(yōu)惠券、發(fā)紅包、發(fā)送Push通知給用戶之外,還要做很多其他的事情。
比如:對(duì)于一個(gè)電商APP而言,你賣掉了一個(gè)商品,就要扣減掉商品的庫(kù)存,而且一旦用戶成功支付了,你還得更新訂單的狀態(tài)變成待發(fā)貨。
也就是說(shuō),在上圖第8個(gè)步驟里,其實(shí)是有很多事情要做的,明哥說(shuō)著在上圖里的步驟8的地方補(bǔ)充進(jìn)去了幾個(gè)子步驟,看下圖紅圈中的部分:
? ? ? ? ? ?

? ? ? ? ? ? ?
現(xiàn)在根據(jù)我們線上系統(tǒng)的統(tǒng)計(jì),這個(gè)步驟8那里的多個(gè)子步驟全部執(zhí)行完畢,加起來(lái)大概需要1秒~2秒的時(shí)間
有時(shí)候在高峰期負(fù)載壓力很高的時(shí)候,如果數(shù)據(jù)庫(kù)的負(fù)載較高,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器的磁盤、IO、CPU的負(fù)載都很高,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)上執(zhí)行的SQL語(yǔ)句性能有所下降。
因此在高峰期的時(shí)候,有的時(shí)候甚至需要幾秒鐘的時(shí)間完成上述幾個(gè)步驟。
那么他的影響是什么呢?
想象一下,如果你是一個(gè)用戶,結(jié)果你在支付完一個(gè)訂單之后,界面上會(huì)有一個(gè)圈圈不停的旋轉(zhuǎn),讓你等待好幾秒之后才能提示支付成功。
對(duì)用戶來(lái)說(shuō),幾秒鐘的時(shí)間,會(huì)讓人非常不耐煩的!
所以,首先針對(duì)步驟8里的子步驟過(guò)多,速度過(guò)慢,讓用戶支付之后等待時(shí)間過(guò)長(zhǎng)的問(wèn)題,就是訂單系統(tǒng)第一個(gè)亟需解決的問(wèn)題!
小猛聽(tīng)完明哥的分析之后,呆了一會(huì)兒。顯然剛剛畢業(yè)第一次接觸互聯(lián)網(wǎng)類的系統(tǒng),需要一點(diǎn)時(shí)間給他去消化。
過(guò)了一會(huì)兒,他跟明哥說(shuō):明哥,今天的信息量真的很大,我今晚回去再好好捋捋,好好做一下總結(jié)和筆記。
明哥笑笑:好好加油,利用好你現(xiàn)在單身的優(yōu)勢(shì),技術(shù)上迅速成長(zhǎng)起來(lái)。你明哥是過(guò)來(lái)人,等你談戀愛(ài)、結(jié)婚、有了小孩,就。。。
?
End
專欄版權(quán)歸公眾號(hào)儒猿技術(shù)窩所有
未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任