導(dǎo)語(yǔ):IT領(lǐng)域的5個(gè)9是啥?
寫(xiě)下這個(gè)題目時(shí)感覺(jué)是給自己挖了一個(gè)大坑晌端,就像是在嘗試回答前段時(shí)間在知乎上很火的一個(gè)討論“為什么很多看起來(lái)不是很復(fù)雜的網(wǎng)站捅暴,比如Facebook需要大量頂尖高手來(lái)開(kāi)發(fā)?”咧纠。人們可能已經(jīng)習(xí)慣于生活中的很多事情蓬痒,比如你隨手拿起手機(jī)就可以打一個(gè)電話出去,打開(kāi)一個(gè)APP就可以買(mǎi)一件心儀的商品漆羔,但是你可曾想過(guò)這背后對(duì)應(yīng)的電信領(lǐng)域/IT領(lǐng)域的5個(gè)9的要求梧奢?那么問(wèn)題來(lái)了什么是5個(gè)9?通俗的講就是一年中有99.999%的時(shí)間服務(wù)都是必須可用的演痒,也就是意味這一年中只允許最多只有5.26分鐘服務(wù)是不可用的流炕,這中間還包括系統(tǒng)升級(jí)的時(shí)間逢勾。在飛機(jī)系統(tǒng)領(lǐng)域這個(gè)要求則達(dá)到了9個(gè)9员帮,這也是為什么飛機(jī)依然是世界上最安全的交通工具亥贸。
1、軟件系統(tǒng)的非功能性需求
那么設(shè)計(jì)一個(gè)這樣高可靠高可用的互聯(lián)網(wǎng)軟件系統(tǒng)到底需要哪些因素呢讯嫂?本文不會(huì)討論互聯(lián)網(wǎng)世界紛繁復(fù)雜的功能性需求比如電商的購(gòu)物車(chē)如何設(shè)計(jì)蹦锋,P2P行業(yè)的買(mǎi)賣(mài)標(biāo)如何實(shí)現(xiàn);而是試圖探討在這些看起來(lái)完全不同的系統(tǒng)背后所需要的通用的需求端姚,IT領(lǐng)域有個(gè)專(zhuān)有的名詞來(lái)概括這些需求叫做非功能性需求:Non-functional Requirements. 什么是非功能性需求呢晕粪,維基上的定義如下是指依一些條件判斷系統(tǒng)運(yùn)作情形或其特性挤悉,而不是針對(duì)系統(tǒng)特定行為的需求渐裸。非功能性需求是一個(gè)系統(tǒng)能夠達(dá)到的高質(zhì)量,高穩(wěn)定装悲,高可靠昏鹃,高性能,高可用的程度诀诊。
非功能性需求相對(duì)于功能性需求不為大多數(shù)人知道洞渤,但是并不代表不重要。按筆者理解它也屬于用戶體驗(yàn)的一部分属瓣;試想你打開(kāi)一個(gè)電商網(wǎng)站载迄,數(shù)據(jù)加載花了1分鐘你還有興趣在這家網(wǎng)站買(mǎi)東西么?那么衡量這個(gè)非功能性需求的指標(biāo)就是系統(tǒng)響應(yīng)時(shí)間-Reponse Time 抡蛙。再或者一個(gè)在線旅游網(wǎng)站連續(xù)幾個(gè)小時(shí)網(wǎng)站打不開(kāi)护昧,損失的不只是幾個(gè)小時(shí)的訂單,還有用戶的信任度和對(duì)品牌的負(fù)面影響粗截,衡量這個(gè)非功能性需求的指標(biāo)就是系統(tǒng)的高可用性-High Availability惋耙。
非功能性需求聽(tīng)起來(lái)是幾個(gè)簡(jiǎn)單的指標(biāo)和衡量標(biāo)準(zhǔn),可是為了達(dá)到一定的性能指標(biāo)后面所涉及到的技術(shù)和系統(tǒng)規(guī)模都是常人無(wú)法想像的,后面凝聚著無(wú)數(shù)工程師團(tuán)隊(duì)的智慧和勞動(dòng)绽榛。下面的章節(jié)筆者會(huì)簡(jiǎn)單介紹一下這幾個(gè)非功能性需求指標(biāo)和它們背后對(duì)應(yīng)的一些可能的技術(shù)方案湿酸。
2、非功能性需求的幾個(gè)重要指標(biāo)
2.1高可用性-High Availability
高可用性是一個(gè)系統(tǒng)的重要特征灭美,是指一個(gè)系統(tǒng)可以連續(xù)服務(wù)的時(shí)間推溃,就是本文開(kāi)篇提到的5個(gè)9,對(duì)于5個(gè)9的系統(tǒng)來(lái)說(shuō)一年宕機(jī)時(shí)間不能超過(guò)5.26分鐘届腐。也許您可能不覺(jué)得這個(gè)時(shí)間算什么美莫,但是如果你知道這里的需求是針對(duì)任何可抗和不可抗的情況下都需要滿足的需求時(shí)就不一樣了。不可抗是指發(fā)生火災(zāi)梯捕,地震時(shí)你的系統(tǒng)依然能夠正常服務(wù)厢呵。這就意味著你可能不只是需要在上海的機(jī)房擁有你的系統(tǒng)還要在北京也擁有一套同樣的系統(tǒng),而且兩個(gè)系統(tǒng)的數(shù)據(jù)還必須時(shí)同步的傀顾,這樣才能保證作為一個(gè)用戶當(dāng)你使用網(wǎng)上系統(tǒng)時(shí)絲毫感受不了任何問(wèn)題的影響而且連數(shù)據(jù)都是準(zhǔn)確無(wú)誤的襟铭!為了這5.26分鐘,攻城獅們需要搭建高可靠的系統(tǒng)短曾,不能有單點(diǎn)故障寒砖,建立本地冗余,異活嫉拐,錯(cuò)誤檢測(cè)和無(wú)縫切換哩都,考慮各種極端的情況下如何做數(shù)據(jù)同步,系統(tǒng)升級(jí)時(shí)如何做到服務(wù)不間斷婉徘。
2.2性能和可擴(kuò)展性-Performance and Scalability
性能是指整個(gè)軟件系統(tǒng)在訪問(wèn)高峰時(shí)段能夠支持的高峰并發(fā)會(huì)話數(shù)漠嵌,而可擴(kuò)展性是指基于單臺(tái)服務(wù)器可支持的會(huì)話數(shù)基礎(chǔ)上是否只是單純?cè)黾臃?wù)器數(shù)量就能支持成倍增長(zhǎng)的會(huì)話數(shù)。這兩年互聯(lián)網(wǎng)行業(yè)蓬勃發(fā)展盖呼,每天會(huì)冒出無(wú)數(shù)的APP儒鹿,最初一些小的APP因?yàn)榭蛻羧后w比較小同時(shí)在線也不多對(duì)系統(tǒng)性能要求和可擴(kuò)展性也不高,但是如果突然某天APP火起來(lái)几晤,用戶量激增约炎,那么系統(tǒng)能夠快速擴(kuò)容就是挑戰(zhàn)一款應(yīng)用成敗的關(guān)鍵了。因此在設(shè)計(jì)的初期就把單臺(tái)服務(wù)器的性能調(diào)優(yōu)考慮進(jìn)去蟹瘾,并且考慮系統(tǒng)是否可以近似線性的擴(kuò)容是應(yīng)對(duì)這個(gè)問(wèn)題的關(guān)鍵圾浅。提高了性能和可擴(kuò)展性是隱性的節(jié)約成本,節(jié)省的不僅僅是服務(wù)器/IDC和運(yùn)營(yíng)成本憾朴,還有最重要的是時(shí)間成本狸捕。
2.3系統(tǒng)的特性-Characteristic
顧名思義,系統(tǒng)的特性是指作為一個(gè)獨(dú)立的系統(tǒng)需要支持的獨(dú)特特殊非功能性需求伊脓。不同的軟件系統(tǒng)所需要支持的特性是不同的府寒,比如視頻網(wǎng)站需要的低延時(shí)魁衙,保證視頻能夠被流暢的播放;P2P網(wǎng)站要求的是數(shù)據(jù)精準(zhǔn)株搔,以保證任何時(shí)候用戶投資收益是正確的剖淀。而無(wú)論是視頻網(wǎng)站還是P2P系統(tǒng)又都要求系統(tǒng)的響應(yīng)時(shí)間盡量的短,以保證良好的用戶體驗(yàn)纤房。因此針對(duì)不同的互聯(lián)網(wǎng)系統(tǒng)纵隔,我們需要制定不同的系統(tǒng)特性參數(shù)以提高用戶的滿意度。
2.4系統(tǒng)的可維護(hù)性-Maintainability
系統(tǒng)的可維護(hù)性在互聯(lián)網(wǎng)產(chǎn)品初期階段可能并不能引起很高的重視炮姨,因?yàn)槌跗陔A段最重要的痛點(diǎn)是快速占領(lǐng)市場(chǎng)捌刮。但是等到產(chǎn)品發(fā)展到一定階段,一個(gè)系統(tǒng)的可維護(hù)性又會(huì)成為繼續(xù)發(fā)展壯大的瓶頸舒岸∩鹱鳎可維護(hù)性主要考慮下面幾個(gè)因素:
3、結(jié)束語(yǔ)
軟件系統(tǒng)的非功能性需求是一個(gè)很大的題目蛾派,如果要展開(kāi)說(shuō)可能不是這樣的篇幅能夠涵蓋的俄认。在所有的非功能性需求中用戶體驗(yàn)是已經(jīng)被廣大互聯(lián)網(wǎng)用戶所了解的,而文中所提到的幾個(gè)非功能性需求背后對(duì)應(yīng)的都是一個(gè)龐大的解決方案需要無(wú)數(shù)的軟硬件系統(tǒng)協(xié)作來(lái)完成洪乍。
套用Fenng所說(shuō)的:技術(shù)的作用從短期來(lái)看往往都被高估眯杏,但是從長(zhǎng)期來(lái)看又往往被低估。
本文作者:陳琨(點(diǎn)融黑幫)壳澳,現(xiàn)任點(diǎn)融網(wǎng)資深軟件開(kāi)發(fā)工程師岂贩,曾就職于愛(ài)立信,華為巷波,關(guān)注于高并發(fā)高可用的互聯(lián)網(wǎng)軟件系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)萎津。