架構(gòu)設(shè)計(jì)系列文章,請參見連接图谷。
背景
一個(gè)架構(gòu)師在平時(shí)工作中的重點(diǎn)注意的工作內(nèi)容蔗崎,就指明架構(gòu)師所設(shè)計(jì)的產(chǎn)品架構(gòu)的各方面特性。重點(diǎn)是數(shù)據(jù)庫的架構(gòu)師會將認(rèn)為所有的工作核心就是數(shù)據(jù)庫促绵。重點(diǎn)在運(yùn)營模式的架構(gòu)師會認(rèn)為所有的工作都是業(yè)務(wù)模式,運(yùn)營方法。
再加上公司整體規(guī)劃與方向有著非常明顯的弱化技術(shù)的要求败晴,架構(gòu)師為了KPI浓冒、OKR放棄對產(chǎn)品架構(gòu)的關(guān)心。就會造成整個(gè)公司少了架構(gòu)師還是正常運(yùn)轉(zhuǎn)的情況位衩。但是做一個(gè)真是的比喻裆蒸,就如同下圖一樣:
少了技術(shù)型架構(gòu)師的驅(qū)動(dòng)的公司熔萧,就像上圖一樣糖驴。在不做變更的時(shí)候會使用的很正常,很穩(wěn)定佛致。但是如果稍微做一點(diǎn)變更整個(gè)系統(tǒng)就會進(jìn)入崩潰狀態(tài)贮缕。
每一個(gè)上線的產(chǎn)品,最主要的問題就是穩(wěn)定性俺榆。為了應(yīng)用能夠穩(wěn)定的提供服務(wù)感昼,需要考慮很多內(nèi)容。其中性能優(yōu)化就是很重要的一個(gè)考慮項(xiàng)罐脊。性能優(yōu)化是事后解決性能問題的方法定嗓,也有很多事前解決性能問題的方法。下面整體介紹性能優(yōu)化的各個(gè)方面萍桌。
前期規(guī)劃
在做一件事情之前宵溅,需要對這件事情有深入的認(rèn)識與理解。然后基于認(rèn)識和理解之后上炎,對事情進(jìn)行分析恃逻。分析后做出整體做事的規(guī)劃或方法,然后再著手進(jìn)行實(shí)施藕施。
根據(jù)上面做事方式的指導(dǎo)寇损。先對性能優(yōu)化這件事情進(jìn)行整體的規(guī)劃。因?yàn)樾阅軆?yōu)化是項(xiàng)目實(shí)施過程中的一個(gè)步驟裳食,所以在這里將說明在項(xiàng)目實(shí)施過程與性能優(yōu)化之間的關(guān)系:
上圖中淺藍(lán)色部分是項(xiàng)目管理過程中要做的矛市。深藍(lán)色部分是性能優(yōu)化設(shè)計(jì)到的步驟。藍(lán)黑色部分是項(xiàng)目研發(fā)過程中的內(nèi)容诲祸。在上產(chǎn)品環(huán)境后浊吏,肯定還需要各種各樣的性能調(diào)優(yōu)工作。例如:最近幾年淘寶烦绳,京東都在做《全鏈路壓測》的事情卿捎。所以這件事情需要一直做下去。
-
調(diào)研:
在整體項(xiàng)目實(shí)施規(guī)劃中径密,非功能需求是一個(gè)很容易被忽略的部分午阵。我們在做設(shè)計(jì)的一個(gè)基本依據(jù)就是非功能需求。有了它之后就可以估算出系統(tǒng)的整體性能要求大概范圍。根據(jù)這個(gè)范圍以及成本底桂、時(shí)間約束就可以對系統(tǒng)中需要使用的技術(shù)植袍,不使用的技術(shù)做出一個(gè)前期規(guī)劃與設(shè)計(jì)。針對產(chǎn)品型的性能數(shù)據(jù)評估籽懦。因?yàn)楫a(chǎn)品是已經(jīng)上線的于个,所以,就可以根據(jù)現(xiàn)有的數(shù)據(jù)以及即將來到的運(yùn)營策劃數(shù)據(jù)進(jìn)行性能數(shù)據(jù)的評估暮顺。這里就需要了解現(xiàn)有系統(tǒng)的使用情況數(shù)據(jù)厅篓,性能、穩(wěn)定性表現(xiàn)情況之后捶码。在作出相關(guān)的評估與設(shè)計(jì)羽氮。
-
設(shè)計(jì):
設(shè)計(jì)階段中根據(jù)前面收集的功能需求,非功能需求以及約束進(jìn)行分析惫恼。分析出問題域中的核心問題档押,周邊問題并將這些問題域的問題使用解決域提供的工具進(jìn)行解決。解決域中的工具取決于架構(gòu)師準(zhǔn)備了那些工具祈纯。所以令宿,在同一個(gè)問題域下,架構(gòu)師的解決域確定了解決的方式腕窥。因?yàn)樾阅苁窃O(shè)計(jì)的依據(jù)粒没,而性能有事從非功能需求來的。所以油昂,對性能的交付也是需要有驗(yàn)收過程與驗(yàn)收方法的革娄。在設(shè)計(jì)過程中需要將性能的驗(yàn)收方法,驗(yàn)收標(biāo)準(zhǔn)一并進(jìn)行設(shè)計(jì)冕碟。
在產(chǎn)品型的性能設(shè)計(jì)過程中是有相對應(yīng)的《性能驗(yàn)收軟件架構(gòu)》需要同時(shí)進(jìn)行設(shè)計(jì)的拦惋。因?yàn)樾阅茯?yàn)收也是一套獨(dú)立的軟件系統(tǒng)。不過這套軟件系統(tǒng)的目標(biāo)就是幫助業(yè)務(wù)系統(tǒng)達(dá)到更高的性能指標(biāo)而存在的安寺。
開發(fā):
開發(fā)過程中需要有規(guī)范的流程厕妖。從代碼質(zhì)量到交付方式,都需要一套標(biāo)準(zhǔn)出來挑庶。這樣就可以有效的保證產(chǎn)品可以按時(shí)按點(diǎn)保質(zhì)的方式進(jìn)行交付言秸。-
監(jiān)控:
在產(chǎn)品上線后運(yùn)維比較關(guān)注的是APM,開發(fā)比較關(guān)注的是Tracing迎捺。監(jiān)控的主要目的是為整個(gè)產(chǎn)品提供運(yùn)行時(shí)數(shù)據(jù)举畸。因?yàn)橹笆褂酶鞣N方法評估的內(nèi)容,都是通過不準(zhǔn)確手段獲取到的數(shù)據(jù)凳枝。真實(shí)的數(shù)據(jù)就可以體現(xiàn)出之前評估節(jié)點(diǎn)所做的評估的偏差抄沮“虾耍可以利用這個(gè)偏差對系統(tǒng)進(jìn)行調(diào)整。也可以利用這個(gè)偏差對評估數(shù)據(jù)進(jìn)行校正叛买,以使之后的評估中的數(shù)據(jù)會更加準(zhǔn)確砂代。在提供產(chǎn)品的性能優(yōu)化數(shù)據(jù)之外,還需要在系統(tǒng)中制定多維度的《度量指標(biāo)》用來幫助之后進(jìn)行各方面的評估率挣。例如:用戶轉(zhuǎn)化率刻伊,產(chǎn)品銷售率,熱點(diǎn)頁面等等椒功。這些數(shù)據(jù)對之后的運(yùn)維捶箱,運(yùn)營都是有著非常大的幫助。
調(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ù)使用情況對系統(tǒng)進(jìn)行有針對性的調(diào)整谦炬。這兩類調(diào)整都是以性能指標(biāo)為輸入,以達(dá)到性能指標(biāo)要求為輸出的节沦。所以键思,在下面會對其中每一步再做詳細(xì)討論。-
上線:
在調(diào)優(yōu)過程中可能會對系統(tǒng)的局部架構(gòu)甫贯,部署設(shè)計(jì)吼鳞,數(shù)據(jù)庫設(shè)計(jì)等作出調(diào)整。所以叫搁,在上線時(shí)需要需要考慮針對這些變化怎樣才能將變化推到生產(chǎn)環(huán)境赔桌。基本上就考慮三種類型的升級:部署升級渴逻,數(shù)據(jù)升級疾党,服務(wù)升級。- 部署升級:部署過程進(jìn)行了升級惨奕,比如說之前直接部署在邏輯環(huán)境上雪位,現(xiàn)在變成部署在K8S上。
- 數(shù)據(jù)升級:數(shù)據(jù)結(jié)構(gòu)發(fā)生了變更梨撞,需要有數(shù)據(jù)結(jié)構(gòu)上的升級工作雹洗。
- 服務(wù)升級:服務(wù)內(nèi)部實(shí)現(xiàn)發(fā)生了變化,需要同時(shí)運(yùn)行老版本卧波,并驗(yàn)證新版本的要求时肿。
實(shí)施過程
性能調(diào)優(yōu)和壓力測試有很多內(nèi)容都是可以重復(fù)利用的。例如測試時(shí)需要編寫測試方案港粱,測試計(jì)劃螃成。都可以在性能調(diào)優(yōu)時(shí)使用。下面是性能調(diào)優(yōu)的實(shí)施步驟:
性能目標(biāo):
不管做什么,第一步都是要明確需要做什么锈颗。性能目標(biāo)在上面已經(jīng)可以通過評估顷霹,實(shí)際數(shù)據(jù)等獲取到性能目標(biāo)。-
環(huán)境準(zhǔn)備:
現(xiàn)在的項(xiàng)目基本上都是用微服務(wù)的方式進(jìn)行發(fā)布击吱。所以環(huán)境準(zhǔn)備階段需要知道服務(wù)的具體部署情況淋淀。需要知道哪些開源組件需要部署,哪些服務(wù)需要配置覆醇。并且還需要設(shè)置性能環(huán)境和發(fā)送性能請求的測試環(huán)境之間的部署結(jié)構(gòu)朵纷,使性能驗(yàn)證過程中受到的外界干擾最小化。根據(jù)之前的目標(biāo)對性能環(huán)境進(jìn)行部署設(shè)計(jì)永脓。在性能環(huán)境中的部署設(shè)計(jì)最終可以推到生產(chǎn)環(huán)境袍辞,但是需要針對性能指標(biāo)進(jìn)行相關(guān)的節(jié)點(diǎn)數(shù)評估,服務(wù)器上的硬件環(huán)境的評估常摧。
需要根據(jù)并發(fā)量考慮性能環(huán)境和測試環(huán)境之間的帶寬搅吁。以及測試環(huán)境的配置,以保證并發(fā)量可以達(dá)到性能要求的水平落午。
-
工具準(zhǔn)備:
工具準(zhǔn)備需要準(zhǔn)備壓測工具和監(jiān)控工具谎懦。一些壓測工具順帶就可以做監(jiān)控的事情但是很多時(shí)候還是要進(jìn)行獨(dú)立準(zhǔn)備±U可以使用JMeter界拦、Load Runner作為壓測工具。也可以使用分布式性能測試工具控制多臺主機(jī)進(jìn)行測試梗劫。監(jiān)控工具要滿足即可以檢測到APM又可以檢測到Tracing的內(nèi)容享甸。并且可以監(jiān)控多項(xiàng)數(shù)據(jù),監(jiān)控主機(jī)性能梳侨,監(jiān)控?cái)?shù)據(jù)庫性能蛉威,監(jiān)控中間件性能等。
測試方法:
即需要驗(yàn)證的場景猫妙,以及驗(yàn)證這些場景所需要的腳本過程瓷翻。在測試計(jì)劃中會編寫要測試的場景,并對場景中的請求內(nèi)容進(jìn)行設(shè)計(jì)割坠。-
優(yōu)化確認(rèn):
已經(jīng)有了工具齐帚,有了測試方法,并且有運(yùn)行環(huán)境彼哼。就可以進(jìn)行測試了对妄,測試會形成測試結(jié)果。再針對測試結(jié)果有針對性的優(yōu)化敢朱。例如某個(gè)方法執(zhí)行時(shí)間過長剪菱,就可以想辦法降低這個(gè)方法的執(zhí)行時(shí)間摩瞎。數(shù)據(jù)庫查詢時(shí)間過長就可以優(yōu)化數(shù)據(jù)庫查詢。在優(yōu)化完之后孝常,在對優(yōu)化的內(nèi)容進(jìn)行一遍性能驗(yàn)證旗们。如果驗(yàn)證通過則進(jìn)行下一步。如果沒有通過則构灸,在此優(yōu)化上渴。往復(fù)循環(huán)這個(gè)過程指導(dǎo)性能驗(yàn)證通過,就可以進(jìn)行進(jìn)入到下一步喜颁。
功能測試:
在做完性能調(diào)優(yōu)之后稠氮,還是需要再進(jìn)行一遍功能驗(yàn)證的。因?yàn)樵趦?yōu)化過程中可能對之前的功能產(chǎn)生了未知的影響半开。所以需要在性能調(diào)優(yōu)完成之后再進(jìn)行一遍功能驗(yàn)證隔披。
總結(jié)
選用性能指標(biāo)是非常重要的,這樣一眼看過去就知道哪里有問題寂拆。在有目標(biāo)的情況下進(jìn)行奢米,針對目標(biāo)進(jìn)行優(yōu)化的效率在開發(fā)過程中猜測可能有性能問題的點(diǎn)并優(yōu)化的效率要高的多。在實(shí)施這套方法時(shí)漓库,也可以享受性能提升帶來的成就感恃慧。