公司要搞雙11大促了,你知道系統(tǒng)能抗多少流量嗎?
今天給大家分享一個(gè)話題,那就是假設(shè)你公司要搞一場(chǎng)雙 11 大促,現(xiàn)在告訴你說,咱們公司就是打算搞了,那你此時(shí)會(huì)一臉懵逼的說,雙 11 大促?會(huì)有多大并發(fā)啊?我們系統(tǒng)能抗住嗎?
你要這樣的話,那老板是一定不高興的了。所以今天就得給大家分析一下,假設(shè)你公司要搞大促,你怎么去通過全鏈路壓測(cè)評(píng)估一下你的核心系統(tǒng)鏈路能抗多大流量?
公司核心系統(tǒng)業(yè)務(wù)調(diào)用鏈路
首先,如果要為雙 11 大促做準(zhǔn)備,咱們必須要對(duì)線上系統(tǒng)直接發(fā)起全鏈路壓測(cè)。
比如說在凌晨業(yè)務(wù)低峰期的時(shí)候,我們自己用壓測(cè)系統(tǒng)對(duì)咱們的線上核心鏈路發(fā)起全鏈路壓測(cè),看看到底我們的整個(gè)系統(tǒng)可以抗多少流量,然后再分析一下,搞大促的時(shí)候,大概會(huì)有多少流量,接著就可以針對(duì)大促活動(dòng)的流量預(yù)估,去擴(kuò)容一下機(jī)器。
那么如果要搞全鏈路壓測(cè)的話,這個(gè)全鏈路壓測(cè)背后的原理大家知道嗎?我們得先給大家講一下這個(gè)全鏈路壓測(cè)背后的原理。
先說一個(gè)非常典型的鏈路,假設(shè)我們整個(gè)平臺(tái)的入口是業(yè)務(wù)系統(tǒng) A,然后他的核心鏈路里面,他會(huì)調(diào)依次調(diào)用業(yè)務(wù)系統(tǒng) B、業(yè)務(wù)系統(tǒng) C、業(yè)務(wù)系統(tǒng) D,同時(shí)還會(huì)讀寫自己的數(shù)據(jù)庫(kù)。
然后業(yè)務(wù)系統(tǒng) B 又會(huì)調(diào)用業(yè)務(wù)系統(tǒng) E,業(yè)務(wù)系統(tǒng) E 又會(huì)調(diào)用業(yè)務(wù)系統(tǒng) F,業(yè)務(wù)系統(tǒng) D 又會(huì)調(diào)用業(yè)務(wù)系統(tǒng) G,每個(gè)業(yè)務(wù)系統(tǒng)都會(huì)讀寫自己的數(shù)據(jù)庫(kù)。
如下圖所示:
看看上面這個(gè)鏈路是不是感覺非常復(fù)雜?沒錯(cuò)的,對(duì)于很多公司的核心系統(tǒng)鏈路來說,就是可能會(huì)有很多個(gè)系統(tǒng)調(diào)用的鏈路。
那么這個(gè)時(shí)候來說的話,我們假設(shè)所有業(yè)務(wù)系統(tǒng)都是單機(jī)部署的,現(xiàn)在來看看,整個(gè)這個(gè)鏈路集成在一起,大概一秒鐘可以跑完多少次這個(gè)鏈路?
QPS 和 TPS 的概念
這里給大家解釋一下 QPS 和 TPS 的概念,QPS 是 Query Per Second,往往是針對(duì)單個(gè)系統(tǒng)自己的接口的,意思就是說自己這個(gè)接口每秒被請(qǐng)求多少次,TPS 是 Transaction Per Second,意思就是說每秒鐘可以完成的事務(wù)數(shù)量。
所以這個(gè) QPS 就不太符合我們這里對(duì)全鏈路壓測(cè)的定位了,因?yàn)槿溌放芟聛?,那不是說每秒多少請(qǐng)求可以定義的。
TPS 是比較符合這個(gè)定位的,因?yàn)槲覀円吹氖敲棵腌娺@個(gè)鏈路跑完,可以跑多少次,跑完一次完整的鏈路,咱們可以認(rèn)為一個(gè) TPS,每秒鐘可以跑完多少次這個(gè)鏈路,那就是 TPS 了。
一次鏈路跑完是靠什么跑的呢?
好,那么接著給大家分析,這個(gè)一次鏈路跑完是靠什么跑的呢?
答案顯而易見,靠的是咱們鏈路入口的那個(gè)業(yè)務(wù)系統(tǒng) A 的一個(gè)線程,因?yàn)榧僭O(shè)業(yè)務(wù)系統(tǒng) A 抗的是 http 請(qǐng)求和流量,那么業(yè)務(wù)系統(tǒng) A 必然是靠 tomcat 來接收 http 請(qǐng)求的。
然后 tomcat 是會(huì)啟動(dòng)多個(gè)線程來處理一個(gè)一個(gè)的請(qǐng)求的,每一個(gè)請(qǐng)求進(jìn)來都會(huì)交給一個(gè)線程來處理。
大家看下圖:
接著呢,這個(gè)線程收到了一個(gè)請(qǐng)求之后,就會(huì)按照調(diào)用鏈路依次去調(diào)用,所以說,要走完一個(gè)鏈路,等于業(yè)務(wù)系統(tǒng) B、業(yè)務(wù)系統(tǒng) E、業(yè)務(wù)系統(tǒng) F 這條鏈路得先走完,然后業(yè)務(wù)系統(tǒng) C,接著是業(yè)務(wù)系統(tǒng) D 和業(yè)務(wù)系統(tǒng) G,再有是自己的數(shù)據(jù)庫(kù)訪問。
單擊全鏈路壓測(cè) TPS 估算
這整個(gè)鏈路跑完大概要花多久呢?這就要看情況了,要看每個(gè)業(yè)務(wù)系統(tǒng)要處理多少時(shí)間了,但是這么復(fù)雜的鏈路,往往跑完起碼要幾百毫秒,我們算他 500ms 吧,基本不多也不少了。
那所以說,此時(shí)我們的 tomcat 中一個(gè)線程,等于每秒也就跑完兩次鏈路而已。
那如果說業(yè)務(wù)系統(tǒng) A 的 tomcat 里開啟了 200 個(gè)線程呢?那等于是每秒的 TPS 大概也就 200*2=400 而已。
也就是業(yè)務(wù)系統(tǒng) A 單臺(tái)機(jī)器在一秒內(nèi),200 個(gè)線程可以處理 400 個(gè)請(qǐng)求,跑完 400 次鏈路,這就是全鏈路壓測(cè)的意義所在,我們要看的是全鏈路跑完一次要耗費(fèi)多久,然后在較大壓力下,一個(gè)線程每秒可以跑完幾次鏈路,再計(jì)算單機(jī)的 TPS。
進(jìn)而就可以根據(jù)這個(gè)單機(jī)全鏈路壓測(cè)去估算搞大促的時(shí)候,每秒要接收多少請(qǐng)求,跑完多少次鏈路,然后就知道要部署多少臺(tái)機(jī)器了。