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