架構(gòu)設(shè)計(jì)系列文章,請(qǐng)參見(jiàn)連接。
背景
一個(gè)架構(gòu)師在平時(shí)工作中的重點(diǎn)注意的工作內(nèi)容,就指明架構(gòu)師所設(shè)計(jì)的產(chǎn)品架構(gòu)的各方面特性。重點(diǎn)是數(shù)據(jù)庫(kù)的架構(gòu)師會(huì)將認(rèn)為所有的工作核心就是數(shù)據(jù)庫(kù)。重點(diǎn)在運(yùn)營(yíng)模式的架構(gòu)師會(huì)認(rèn)為所有的工作都是業(yè)務(wù)模式,運(yùn)營(yíng)方法。
再加上公司整體規(guī)劃與方向有著非常明顯的弱化技術(shù)的要求,架構(gòu)師為了KPI、OKR放棄對(duì)產(chǎn)品架構(gòu)的關(guān)心。就會(huì)造成整個(gè)公司少了架構(gòu)師還是正常運(yùn)轉(zhuǎn)的情況。但是做一個(gè)真是的比喻,就如同下圖一樣:

少了技術(shù)型架構(gòu)師的驅(qū)動(dòng)的公司,就像上圖一樣。在不做變更的時(shí)候會(huì)使用的很正常,很穩(wěn)定。但是如果稍微做一點(diǎn)變更整個(gè)系統(tǒng)就會(huì)進(jìn)入崩潰狀態(tài)。
每一個(gè)上線的產(chǎn)品,最主要的問(wèn)題就是穩(wěn)定性。為了應(yīng)用能夠穩(wěn)定的提供服務(wù),需要考慮很多內(nèi)容。其中性能優(yōu)化就是很重要的一個(gè)考慮項(xiàng)。性能優(yōu)化是事后解決性能問(wèn)題的方法,也有很多事前解決性能問(wèn)題的方法。下面整體介紹性能優(yōu)化的各個(gè)方面。
前期規(guī)劃
在做一件事情之前,需要對(duì)這件事情有深入的認(rèn)識(shí)與理解。然后基于認(rèn)識(shí)和理解之后,對(duì)事情進(jìn)行分析。分析后做出整體做事的規(guī)劃或方法,然后再著手進(jìn)行實(shí)施。
根據(jù)上面做事方式的指導(dǎo)。先對(duì)性能優(yōu)化這件事情進(jìn)行整體的規(guī)劃。因?yàn)樾阅軆?yōu)化是項(xiàng)目實(shí)施過(guò)程中的一個(gè)步驟,所以在這里將說(shuō)明在項(xiàng)目實(shí)施過(guò)程與性能優(yōu)化之間的關(guān)系:

上圖中淺藍(lán)色部分是項(xiàng)目管理過(guò)程中要做的。深藍(lán)色部分是性能優(yōu)化設(shè)計(jì)到的步驟。藍(lán)黑色部分是項(xiàng)目研發(fā)過(guò)程中的內(nèi)容。在上產(chǎn)品環(huán)境后,肯定還需要各種各樣的性能調(diào)優(yōu)工作。例如:最近幾年淘寶,京東都在做《全鏈路壓測(cè)》的事情。所以這件事情需要一直做下去。
-
調(diào)研:
在整體項(xiàng)目實(shí)施規(guī)劃中,非功能需求是一個(gè)很容易被忽略的部分。我們?cè)谧鲈O(shè)計(jì)的一個(gè)基本依據(jù)就是非功能需求。有了它之后就可以估算出系統(tǒng)的整體性能要求大概范圍。根據(jù)這個(gè)范圍以及成本、時(shí)間約束就可以對(duì)系統(tǒng)中需要使用的技術(shù),不使用的技術(shù)做出一個(gè)前期規(guī)劃與設(shè)計(jì)。針對(duì)產(chǎn)品型的性能數(shù)據(jù)評(píng)估。因?yàn)楫a(chǎn)品是已經(jīng)上線的,所以,就可以根據(jù)現(xiàn)有的數(shù)據(jù)以及即將來(lái)到的運(yùn)營(yíng)策劃數(shù)據(jù)進(jìn)行性能數(shù)據(jù)的評(píng)估。這里就需要了解現(xiàn)有系統(tǒng)的使用情況數(shù)據(jù),性能、穩(wěn)定性表現(xiàn)情況之后。在作出相關(guān)的評(píng)估與設(shè)計(jì)。
-
設(shè)計(jì):
設(shè)計(jì)階段中根據(jù)前面收集的功能需求,非功能需求以及約束進(jìn)行分析。分析出問(wèn)題域中的核心問(wèn)題,周邊問(wèn)題并將這些問(wèn)題域的問(wèn)題使用解決域提供的工具進(jìn)行解決。解決域中的工具取決于架構(gòu)師準(zhǔn)備了那些工具。所以,在同一個(gè)問(wèn)題域下,架構(gòu)師的解決域確定了解決的方式。因?yàn)樾阅苁窃O(shè)計(jì)的依據(jù),而性能有事從非功能需求來(lái)的。所以,對(duì)性能的交付也是需要有驗(yàn)收過(guò)程與驗(yàn)收方法的。在設(shè)計(jì)過(guò)程中需要將性能的驗(yàn)收方法,驗(yàn)收標(biāo)準(zhǔn)一并進(jìn)行設(shè)計(jì)。
在產(chǎn)品型的性能設(shè)計(jì)過(guò)程中是有相對(duì)應(yīng)的《性能驗(yàn)收軟件架構(gòu)》需要同時(shí)進(jìn)行設(shè)計(jì)的。因?yàn)樾阅茯?yàn)收也是一套獨(dú)立的軟件系統(tǒng)。不過(guò)這套軟件系統(tǒng)的目標(biāo)就是幫助業(yè)務(wù)系統(tǒng)達(dá)到更高的性能指標(biāo)而存在的。
開(kāi)發(fā):
開(kāi)發(fā)過(guò)程中需要有規(guī)范的流程。從代碼質(zhì)量到交付方式,都需要一套標(biāo)準(zhǔn)出來(lái)。這樣就可以有效的保證產(chǎn)品可以按時(shí)按點(diǎn)保質(zhì)的方式進(jìn)行交付。-
監(jiān)控:
在產(chǎn)品上線后運(yùn)維比較關(guān)注的是APM,開(kāi)發(fā)比較關(guān)注的是Tracing。監(jiān)控的主要目的是為整個(gè)產(chǎn)品提供運(yùn)行時(shí)數(shù)據(jù)。因?yàn)橹笆褂酶鞣N方法評(píng)估的內(nèi)容,都是通過(guò)不準(zhǔn)確手段獲取到的數(shù)據(jù)。真實(shí)的數(shù)據(jù)就可以體現(xiàn)出之前評(píng)估節(jié)點(diǎn)所做的評(píng)估的偏差??梢岳眠@個(gè)偏差對(duì)系統(tǒng)進(jìn)行調(diào)整。也可以利用這個(gè)偏差對(duì)評(píng)估數(shù)據(jù)進(jìn)行校正,以使之后的評(píng)估中的數(shù)據(jù)會(huì)更加準(zhǔn)確。在提供產(chǎn)品的性能優(yōu)化數(shù)據(jù)之外,還需要在系統(tǒng)中制定多維度的《度量指標(biāo)》用來(lái)幫助之后進(jìn)行各方面的評(píng)估。例如:用戶轉(zhuǎn)化率,產(chǎn)品銷(xiāo)售率,熱點(diǎn)頁(yè)面等等。這些數(shù)據(jù)對(duì)之后的運(yùn)維,運(yùn)營(yíng)都是有著非常大的幫助。
調(diào)優(yōu):
這個(gè)是前期調(diào)優(yōu),在項(xiàng)目制或者產(chǎn)品制第一次上線之前進(jìn)行調(diào)優(yōu)。還有后期調(diào)優(yōu),即產(chǎn)品上線之后根據(jù)使用情況對(duì)系統(tǒng)進(jìn)行有針對(duì)性的調(diào)整。這兩類(lèi)調(diào)整都是以性能指標(biāo)為輸入,以達(dá)到性能指標(biāo)要求為輸出的。所以,在下面會(huì)對(duì)其中每一步再做詳細(xì)討論。-
上線:
在調(diào)優(yōu)過(guò)程中可能會(huì)對(duì)系統(tǒng)的局部架構(gòu),部署設(shè)計(jì),數(shù)據(jù)庫(kù)設(shè)計(jì)等作出調(diào)整。所以,在上線時(shí)需要需要考慮針對(duì)這些變化怎樣才能將變化推到生產(chǎn)環(huán)境。基本上就考慮三種類(lèi)型的升級(jí):部署升級(jí),數(shù)據(jù)升級(jí),服務(wù)升級(jí)。- 部署升級(jí):部署過(guò)程進(jìn)行了升級(jí),比如說(shuō)之前直接部署在邏輯環(huán)境上,現(xiàn)在變成部署在K8S上。
- 數(shù)據(jù)升級(jí):數(shù)據(jù)結(jié)構(gòu)發(fā)生了變更,需要有數(shù)據(jù)結(jié)構(gòu)上的升級(jí)工作。
- 服務(wù)升級(jí):服務(wù)內(nèi)部實(shí)現(xiàn)發(fā)生了變化,需要同時(shí)運(yùn)行老版本,并驗(yàn)證新版本的要求。
實(shí)施過(guò)程
性能調(diào)優(yōu)和壓力測(cè)試有很多內(nèi)容都是可以重復(fù)利用的。例如測(cè)試時(shí)需要編寫(xiě)測(cè)試方案,測(cè)試計(jì)劃。都可以在性能調(diào)優(yōu)時(shí)使用。下面是性能調(diào)優(yōu)的實(shí)施步驟:

性能目標(biāo):
不管做什么,第一步都是要明確需要做什么。性能目標(biāo)在上面已經(jīng)可以通過(guò)評(píng)估,實(shí)際數(shù)據(jù)等獲取到性能目標(biāo)。-
環(huán)境準(zhǔn)備:
現(xiàn)在的項(xiàng)目基本上都是用微服務(wù)的方式進(jìn)行發(fā)布。所以環(huán)境準(zhǔn)備階段需要知道服務(wù)的具體部署情況。需要知道哪些開(kāi)源組件需要部署,哪些服務(wù)需要配置。并且還需要設(shè)置性能環(huán)境和發(fā)送性能請(qǐng)求的測(cè)試環(huán)境之間的部署結(jié)構(gòu),使性能驗(yàn)證過(guò)程中受到的外界干擾最小化。根據(jù)之前的目標(biāo)對(duì)性能環(huán)境進(jìn)行部署設(shè)計(jì)。在性能環(huán)境中的部署設(shè)計(jì)最終可以推到生產(chǎn)環(huán)境,但是需要針對(duì)性能指標(biāo)進(jìn)行相關(guān)的節(jié)點(diǎn)數(shù)評(píng)估,服務(wù)器上的硬件環(huán)境的評(píng)估。
需要根據(jù)并發(fā)量考慮性能環(huán)境和測(cè)試環(huán)境之間的帶寬。以及測(cè)試環(huán)境的配置,以保證并發(fā)量可以達(dá)到性能要求的水平。
-
工具準(zhǔn)備:
工具準(zhǔn)備需要準(zhǔn)備壓測(cè)工具和監(jiān)控工具。一些壓測(cè)工具順帶就可以做監(jiān)控的事情但是很多時(shí)候還是要進(jìn)行獨(dú)立準(zhǔn)備。可以使用JMeter、Load Runner作為壓測(cè)工具。也可以使用分布式性能測(cè)試工具控制多臺(tái)主機(jī)進(jìn)行測(cè)試。監(jiān)控工具要滿足即可以檢測(cè)到APM又可以檢測(cè)到Tracing的內(nèi)容。并且可以監(jiān)控多項(xiàng)數(shù)據(jù),監(jiān)控主機(jī)性能,監(jiān)控?cái)?shù)據(jù)庫(kù)性能,監(jiān)控中間件性能等。
測(cè)試方法:
即需要驗(yàn)證的場(chǎng)景,以及驗(yàn)證這些場(chǎng)景所需要的腳本過(guò)程。在測(cè)試計(jì)劃中會(huì)編寫(xiě)要測(cè)試的場(chǎng)景,并對(duì)場(chǎng)景中的請(qǐng)求內(nèi)容進(jìn)行設(shè)計(jì)。-
優(yōu)化確認(rèn):
已經(jīng)有了工具,有了測(cè)試方法,并且有運(yùn)行環(huán)境。就可以進(jìn)行測(cè)試了,測(cè)試會(huì)形成測(cè)試結(jié)果。再針對(duì)測(cè)試結(jié)果有針對(duì)性的優(yōu)化。例如某個(gè)方法執(zhí)行時(shí)間過(guò)長(zhǎng),就可以想辦法降低這個(gè)方法的執(zhí)行時(shí)間。數(shù)據(jù)庫(kù)查詢時(shí)間過(guò)長(zhǎng)就可以優(yōu)化數(shù)據(jù)庫(kù)查詢。在優(yōu)化完之后,在對(duì)優(yōu)化的內(nèi)容進(jìn)行一遍性能驗(yàn)證。如果驗(yàn)證通過(guò)則進(jìn)行下一步。如果沒(méi)有通過(guò)則,在此優(yōu)化。往復(fù)循環(huán)這個(gè)過(guò)程指導(dǎo)性能驗(yàn)證通過(guò),就可以進(jìn)行進(jìn)入到下一步。
功能測(cè)試:
在做完性能調(diào)優(yōu)之后,還是需要再進(jìn)行一遍功能驗(yàn)證的。因?yàn)樵趦?yōu)化過(guò)程中可能對(duì)之前的功能產(chǎn)生了未知的影響。所以需要在性能調(diào)優(yōu)完成之后再進(jìn)行一遍功能驗(yàn)證。
總結(jié)
選用性能指標(biāo)是非常重要的,這樣一眼看過(guò)去就知道哪里有問(wèn)題。在有目標(biāo)的情況下進(jìn)行,針對(duì)目標(biāo)進(jìn)行優(yōu)化的效率在開(kāi)發(fā)過(guò)程中猜測(cè)可能有性能問(wèn)題的點(diǎn)并優(yōu)化的效率要高的多。在實(shí)施這套方法時(shí),也可以享受性能提升帶來(lái)的成就感。