您好,登錄后才能下訂單哦!
這篇文章主要介紹軟件系統(tǒng)穩(wěn)定性的三大秘密分別是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
控制系統(tǒng)理論認(rèn)為:系統(tǒng)受到某種干擾而偏離正常狀態(tài),當(dāng)干擾消除,如果系統(tǒng)的擾動(dòng)能逐漸收斂并最終恢復(fù)正常狀態(tài),則系統(tǒng)是穩(wěn)定的;反之,系統(tǒng)偏離越來(lái)越大,則是不穩(wěn)定的,所以,穩(wěn)定性是系統(tǒng)抗干擾和返回平衡狀態(tài)的能力。
對(duì)于經(jīng)典的傳遞函數(shù)的軟件系統(tǒng),一般我們講的穩(wěn)定指的是BIBO穩(wěn)定,即有界輸入有界輸出穩(wěn)定。一個(gè)系統(tǒng)如果對(duì)任意有界輸入得到有界輸出,它就是BIBO穩(wěn)定的。一句話,穩(wěn)定的系統(tǒng)對(duì)于各種輸入需要有符合預(yù)期的輸出。
隨著軟件復(fù)雜性越來(lái)越高,穩(wěn)定性的保障越來(lái)越難,隨著服務(wù)規(guī)模越來(lái)越大,穩(wěn)定性的重要性越來(lái)越高。阿里云CEO行癲把穩(wěn)定性比喻成木桶的底板,如果穩(wěn)定性出問(wèn)題,則滴水不留,所以,工程師在設(shè)計(jì)和開(kāi)發(fā)軟件的時(shí)候,要堅(jiān)持底板思維。
我們的軟件需求和計(jì)劃很少考慮非功能部分,然而軟件的結(jié)構(gòu)和實(shí)現(xiàn)卻有非常大的比重服務(wù)于此,這也許是軟件項(xiàng)目計(jì)劃經(jīng)常延期的重要原因。
雖然理論上沒(méi)有絕對(duì)穩(wěn)定的系統(tǒng),但我們依然可以有所作為,使我們?cè)O(shè)計(jì)和開(kāi)發(fā)的系統(tǒng)在生產(chǎn)環(huán)境接近穩(wěn)定運(yùn)行。
從大的方面講,穩(wěn)定性保障,可以分成3個(gè)部分:
制度紀(jì)律:
編碼規(guī)范、代碼提交門禁
Code Review
靜態(tài)代碼掃描,動(dòng)態(tài)代碼分析
Unit Test、壓測(cè)
灰度發(fā)布、Rollback、應(yīng)急預(yù)案
監(jiān)控
復(fù)盤、故障樹(shù)分析
思想之道:
保持簡(jiǎn)單、降低復(fù)雜度
不(零)信任、面向失敗設(shè)計(jì)
實(shí)踐之術(shù):
冗余設(shè)計(jì)(數(shù)據(jù)、計(jì)算、帶寬冗余)
快速恢復(fù)設(shè)計(jì)(無(wú)狀態(tài)設(shè)計(jì))
容錯(cuò)、災(zāi)備
隔離
過(guò)載保護(hù)(限流、熔斷、有損服務(wù))
錯(cuò)誤重試策略,避免流量風(fēng)暴
去關(guān)鍵路徑、去中心化、避免單點(diǎn)故障
負(fù)載均衡(load balance)
看門狗設(shè)計(jì)
安全編碼
通過(guò)制度去規(guī)范操作和行為,通過(guò)紀(jì)律去約束大家在框架內(nèi)活動(dòng),被證明是保障穩(wěn)定減少出錯(cuò)行之有效的方式。
紀(jì)律是關(guān)鍵,只有持之以恒的遵守制度,才能避免方法和規(guī)定淪為空談。
但制度和紀(jì)律只是劃出質(zhì)量底線,只能解決大多數(shù)穩(wěn)定性問(wèn)題,難以發(fā)現(xiàn)一些隱匿的問(wèn)題,需要配合思想之道和實(shí)踐之術(shù),持續(xù)改進(jìn)軟件質(zhì)量,才能全面保障穩(wěn)定性。
道是大的層面,它具有全局性的指導(dǎo)意義,我從眾多的指導(dǎo)思想里,挑選最重要的兩點(diǎn):保持簡(jiǎn)單和不信任/面向失敗設(shè)計(jì),展開(kāi)來(lái)講。
復(fù)雜是穩(wěn)定性的天敵,保持簡(jiǎn)單即保持穩(wěn)定。單一職責(zé),功能清晰即是踐行保持簡(jiǎn)單。
把簡(jiǎn)單的東西搞復(fù)雜很容易,而化繁為簡(jiǎn)則堪稱化腐朽為神奇。所以保持簡(jiǎn)單并不是低要求,它需要你透過(guò)表象洞悉事物本質(zhì),用最直接最土味的方式解決問(wèn)題,做技術(shù)的同學(xué)有一個(gè)奇怪的癖好,喜歡把自己最近琢磨的東西用到項(xiàng)目中,不然總有錦衣夜行的感覺(jué)。
我的建議是“學(xué)深用淺”。引入復(fù)雜性,一方面要權(quán)衡收益,另一方面要警惕損傷,要理解項(xiàng)目開(kāi)發(fā)很多時(shí)候是團(tuán)隊(duì)合作,任何復(fù)雜性的引入都會(huì)對(duì)合作者提出更高要求,嚴(yán)以律人是危險(xiǎn)的,低門檻才是符合人性的。
不信任設(shè)計(jì)又叫零信任設(shè)計(jì),和面向失敗的設(shè)計(jì)有相似之處,其本質(zhì)都是防御性編程思想。
不信任設(shè)計(jì)思想假設(shè)系統(tǒng)依賴的上下游都不靠譜,假設(shè)周圍都是壞人,假設(shè)攻擊無(wú)處不在。
網(wǎng)絡(luò)服務(wù)需要對(duì)客戶端請(qǐng)求參數(shù)做嚴(yán)格驗(yàn)證,不僅檢查合法性,也要驗(yàn)證NaN。游戲開(kāi)發(fā)有一句名言:假設(shè)客戶端的數(shù)據(jù)都是假的。
進(jìn)程內(nèi)的函數(shù)調(diào)用大多時(shí)候很安全,會(huì)有可預(yù)期的結(jié)果,但如果跨進(jìn)程調(diào)用(RPC)的可靠性則會(huì)低很多,有可能超時(shí),有可能丟包,有可能失敗,調(diào)用者必須意識(shí)并處理好各種異常情況,是重試?如果重試的話重試多少次?重試之間的間隔應(yīng)該怎么確定?請(qǐng)求的上下文怎么保存和恢復(fù)?
我們要正確理解不信任設(shè)計(jì)的內(nèi)涵,避免用力過(guò)猛,警惕借面向失敗設(shè)計(jì)之名行無(wú)效編程之實(shí),比如已經(jīng)對(duì)客戶端請(qǐng)求數(shù)據(jù)做了嚴(yán)格校驗(yàn),在服務(wù)器處理過(guò)程中,重復(fù)檢驗(yàn),比如已經(jīng)對(duì)接口入?yún)⑴锌?,在?nèi)部調(diào)用過(guò)程中重復(fù)判斷。這會(huì)降低代碼濃度,混入大量無(wú)效代碼,損傷可讀性和執(zhí)行效率,本質(zhì)上是違背“保持簡(jiǎn)單”原則的。
術(shù)是局部層面,它是實(shí)踐經(jīng)驗(yàn),牽扯方方面面,難以盡數(shù)枚舉。
如果以文章寫作類比軟件開(kāi)發(fā),謀篇布局相當(dāng)于設(shè)計(jì)層面,設(shè)計(jì)層面要致廣遠(yuǎn),遣詞造句相當(dāng)于實(shí)現(xiàn)層面,實(shí)現(xiàn)層面要盡精微。
所謂千里之堤潰于蟻穴,防微杜漸功德無(wú)量。
冗余設(shè)計(jì)指留出安全余量,冗余包括數(shù)據(jù)冗余、計(jì)算冗余、帶寬冗余。
數(shù)據(jù)冗余指一份數(shù)據(jù)多個(gè)副本,一主多備。
計(jì)算冗余,比如服務(wù)實(shí)例的QPS極限是10K,但實(shí)際上我們會(huì)按5K跑,這樣,即使出現(xiàn)流量超速增長(zhǎng),我們依然有反應(yīng)時(shí)間。
互聯(lián)網(wǎng)服務(wù)很多都是無(wú)狀態(tài)設(shè)計(jì),服務(wù)實(shí)例只是邏輯的盒子,后面跟著分布式一致性數(shù)據(jù)庫(kù),這樣能極大簡(jiǎn)化設(shè)計(jì),即使實(shí)例掛了,客戶可以很容易遷移到其他服務(wù)實(shí)例執(zhí)行,而有狀態(tài)設(shè)計(jì)則要復(fù)雜難搞得多。
容錯(cuò)指我們的系統(tǒng)要有一定的錯(cuò)誤容忍能力,這意味錯(cuò)誤發(fā)生,我們要能查錯(cuò)、檢錯(cuò)、避錯(cuò)、甚至改錯(cuò),只要可能,我們就要吞咽錯(cuò)誤。
災(zāi)備這個(gè)大家耳熟能詳,主從設(shè)計(jì),異地備災(zāi),目標(biāo)都是為了應(yīng)對(duì)各種極限情況。
隔離本質(zhì)上就是說(shuō)如果故障發(fā)生了,如果故障發(fā)生,而又不能吞咽,那也應(yīng)該隔離避免錯(cuò)誤傳播擴(kuò)散,千方百計(jì)縮小影響范圍,相當(dāng)于感染新冠要被隔離起來(lái)。容器化等技術(shù)為隔離提供良好能力支撐。
熔斷:
機(jī)制不止軟件設(shè)計(jì)獨(dú)有,股市也有,我甚至懷疑軟件的熔斷機(jī)制是從股市學(xué)來(lái)的。
限流:
系統(tǒng)設(shè)計(jì)要做好資源耗盡、資源不夠用的情況,如果服務(wù)請(qǐng)求超過(guò)服務(wù)能力,那就應(yīng)該限流,這應(yīng)該作為一種配置,或者自動(dòng)執(zhí)行的策略。
這個(gè)跟地鐵限流差不多,處理不了,那就排隊(duì)。
有損服務(wù):
有損服務(wù)我印象中最先是騰訊跟海量服務(wù)的概念一起提出來(lái)的,指如果出現(xiàn)服務(wù)能力不夠,不能為所有客戶所有業(yè)務(wù)提供服務(wù)的異常情況,那系統(tǒng)有所取舍,盡可能保持業(yè)務(wù)運(yùn)行,減少損失,比如在微信服務(wù)器在處理能力有限的情況下,可以優(yōu)先保消息發(fā)送,而關(guān)閉朋友圈服務(wù)能力,比如直播業(yè)務(wù)在帶寬有限的情況下,應(yīng)該降低碼率減少清晰度,而不應(yīng)該拒絕服務(wù)。
有損的意義就是有損失,有損傷的意思,它是一種思想,是退而求其次,是不得已而為之。
如果設(shè)計(jì)一個(gè)ToC服務(wù),在客戶大規(guī)模斷連的情況下,客戶會(huì)重連,重連失敗再連,如果重連嘗試的頻率不控制好,正??蛻舳酥剡B有可能演變成對(duì)服務(wù)器的大規(guī)模攻擊,打爆一臺(tái)服務(wù)器,又去滅另一臺(tái),這太嚇人了。
可以參考kernel TCP的重連策略,有最大嘗試次數(shù),而且重試間隔是逐漸拉大的。
企業(yè)不要關(guān)鍵先生,關(guān)鍵先生會(huì)成為瓶頸,軟件也不能把寶壓到一個(gè)地方,去中心化去集中式,沒(méi)什么難理解的。
load balance其實(shí)就是分擔(dān)壓力,LB要避免傾斜,有多種LB算法,比如RR,比如一致性hash,各有利弊,有興趣可以研究下。
LB不僅限于服務(wù),進(jìn)程內(nèi)的多線程可能也會(huì)需要考慮這個(gè)問(wèn)題。
可以參考kernel的watch dog,其實(shí)就是看護(hù)機(jī)制,檢測(cè)錯(cuò)誤并努力掰過(guò)來(lái)。
安全編碼是一個(gè)職業(yè)程序員的基本要求,安全編碼規(guī)則很多,很細(xì)節(jié)的一些規(guī)矩。這個(gè)可能跟語(yǔ)言相關(guān),如果是C++相關(guān)的可以參考:C++的門門道道
C相關(guān)的規(guī)則要少一些,我順手列舉一些。
比如要注意初始化。
比如全局變量不要有構(gòu)造順序的依賴。
比如慎用強(qiáng)轉(zhuǎn),強(qiáng)轉(zhuǎn)等于接管了編譯幫你做的類型檢查。
比如理解線程安全函數(shù),理解可重入的概念,理解信號(hào)機(jī)制。
比如要避免死鎖,理解ABBA鎖理解自死鎖。
比如要謹(jǐn)防資源泄漏。
比如處理好內(nèi)存分配失敗的情況,理解野/懸垂指針。
比如要處理好邊界,防止越界,溢出。
比如內(nèi)存拷貝要避免內(nèi)存重疊,理解memmove的用途。
比如理解遞歸的低效和棧的大小限制,避免爆棧。
比如建議使用STD安全版本函數(shù)(_s+n)版本。
比如了解unsigned < 0導(dǎo)致死循環(huán)的情況。
比如了解浮點(diǎn)數(shù)跟0比較的問(wèn)題。
比如理解整型數(shù)據(jù)溢出和反轉(zhuǎn)。
比如不要返回臨時(shí)變量的引用或者指針,理解棧幀動(dòng)態(tài)伸縮的原理。
比如理解做好把關(guān)檢查的必要性,包括系統(tǒng)把關(guān)和模塊把關(guān)。
最后來(lái)讀段經(jīng)典:《系統(tǒng)化思維導(dǎo)論》一書(shū)中引用馮諾依曼的話寫道:如果你觀察一些自動(dòng)裝置,不論它們是人類設(shè)計(jì)的還是自然界本來(lái)就存在的,你通常會(huì)發(fā)現(xiàn),它們的結(jié)構(gòu)很大程度上受控于它們可能失效的方式,以及針對(duì)失效所采取的防御性措施(多少有些效果),說(shuō)它們能預(yù)防失效有點(diǎn)夸張,它們不是能預(yù)防失效的,只是被設(shè)計(jì)成試圖達(dá)到這種狀態(tài),這樣至少大部分失效都不會(huì)是毀滅性的。所以,根本談不上消除失效,或完全消除失效帶來(lái)的影響。我們能嘗試的只是設(shè)計(jì)一種自動(dòng)裝置,在大部分失效發(fā)生時(shí)仍能繼續(xù)工作,這種裝置減輕了失效的后果,而不是治愈失效,大部分人造的和自然界存在的自動(dòng)裝置,其內(nèi)部原理都是如此。
以上是“軟件系統(tǒng)穩(wěn)定性的三大秘密分別是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。