一、分布式系統為什么具有健壯性
健壯(zhuang)性是指在異(yi)常和危(wei)險情(qing)況下系統(tong)生(sheng)存的(de)能力,分布(bu)式系統(tong)一般具有(you)健壯(zhuang)性,這(zhe)是因為:
1、分布(bu)式系統的處理和控(kong)制功(gong)能(neng)是分布(bu)的,任何站點(dian)發(fa)生的故障(zhang)都不會給整個系統造(zao)成太(tai)大的影響。
2、當分布式系(xi)統中的設(she)備出現故障時,可以通過容錯技術(shu)實現系(xi)統的重(zhong)構,以保證系(xi)統的正常運行。
二、怎么構建健壯的分布式系統
分(fen)布式系(xi)統(tong)(tong)一(yi)般都具有健壯(zhuang)性,不(bu)(bu)過(guo)面對越來越普遍隨機(ji)故障,如果系(xi)統(tong)(tong)構建(jian)不(bu)(bu)當的話,也會(hui)導致(zhi)系(xi)統(tong)(tong)運行出現問題,要(yao)構建(jian)健壯(zhuang)的分(fen)布式系(xi)統(tong)(tong),主要(yao)注意以(yi)下幾點:
1、最小化組件間依賴
分(fen)布(bu)式系統的組件相互通信以獲(huo)取(qu)數據(ju)或(huo)功能(neng)。在這兩種情況下,我們都可以通過將數據(ju)/功能(neng)推送到調用組件而不是遠程訪問(wen)來減(jian)少(shao)連接需求。
構建大規模分(fen)布式系統迫使我(wo)們(men)放棄(qi)標準軟件工程的許(xu)多“最佳實踐”。要(yao)記住的關鍵是,當我(wo)們(men)采用(yong)分(fen)布式系統的復雜性(xing)來實現可擴展性(xing)時(shi),我(wo)們(men)還需要(yao)盡可能(neng)地控制“分(fen)布”。
(1)重復數據
如果我(wo)(wo)們經常從另一個(ge)組(zu)(zu)件(jian)訪問(wen)一些數(shu)據,我(wo)(wo)們可以(yi)在我(wo)(wo)們的(de)組(zu)(zu)件(jian)中復制它,而不必(bi)在運行(xing)時(shi)檢(jian)索(suo)它。這可以(yi)大(da)大(da)減少運行(xing)時(shi)依賴并幫助改善(shan)我(wo)(wo)們組(zu)(zu)件(jian)的(de)延遲。
經(jing)常訪問但(dan)(dan)有(you)一定規律性變化(hua)(hua)的(de)數據可(ke)以(yi)通(tong)過定期緩存(cun)刷新來臨時(shi)緩存(cun)。更改頻率更低或從不更改的(de)數據(例如客戶姓名)可(ke)以(yi)直(zhi)接(jie)存(cun)儲在我們(men)的(de)組件中。如果/當(dang)這(zhe)些數據發(fa)生(sheng)變化(hua)(hua)時(shi),我們(men)可(ke)能需要做一些額外的(de)工(gong)作,但(dan)(dan)是(shi)這(zhe)種增(zeng)加(jia)的(de)小開銷通(tong)常是(shi)值得(de)的(de),因為它(ta)可(ke)以(yi)提高(gao)彈性。
(2)非規范化數據
非規范化是在組件內發生(sheng)的一種特(te)殊(shu)形式(shi)的重復(fu)。如果(guo)我們使用(yong)關系(xi)數據(ju)(ju)存儲,我們可(ke)以通(tong)過在主實體中(zhong)復(fu)制數據(ju)(ju)來降低查看多個實體的成本。本地化分(fen)散(san)數據(ju)(ju)以獲得更好性能的原(yuan)則也(ye)適用(yong)于此。
(3)庫
為(wei)了減(jian)輕另一(yi)個組件的功(gong)能(neng)(neng)依賴性,我(wo)們(men)可(ke)(ke)以將遠程(cheng)組件打包為(wei)庫(ku)并(bing)(bing)將其(qi)嵌入到我(wo)們(men)的組件中。這并(bing)(bing)不總是可(ke)(ke)能(neng)(neng)的(它可(ke)(ke)能(neng)(neng)是用其(qi)他語言編(bian)寫(xie)的,或者(zhe)太大而不能(neng)(neng)成(cheng)為(wei)一(yi)個庫(ku))并(bing)(bing)且會帶來一(yi)系列問題(功(gong)能(neng)(neng)的變化需要跨多個組件進(jin)行庫(ku)升(sheng)級),但是如(ru)果功(gong)能(neng)(neng)很關鍵并(bing)(bing)且經(jing)常被大規(gui)模訪問,這是打破組件間連(lian)接(jie)并(bing)(bing)使其(qi)成(cheng)為(wei)本地的可(ke)(ke)行方(fang)法(fa)。
2、隔離錯誤
錯(cuo)誤(wu)隔離很重要,原(yuan)因有兩個(ge)。一是(shi)個(ge)別錯(cuo)誤(wu)在分布式系統(tong)中更常見(許多移動(dong)部件的(de)簡單功(gong)能)。另(ling)一個(ge)是(shi),如(ru)果(guo)我們(men)不能防止整個(ge)系統(tong)中的(de)聯鎖錯(cuo)誤(wu),那(nei)么我們(men)首先就(jiu)失去了構建復雜(za)體的(de)理(li)由。
錯誤(wu)隔離(li)的(de)主要(yao)結(jie)構是(shi)SLA。每(mei)個組(zu)件(jian)都聲明了一(yi)些質量參(can)數,它(ta)將在執行(xing)功能時得到尊重。這些參(can)數可(ke)以包括延遲、錯誤(wu)率、并(bing)發性等。在此SLA之(zhi)外,調(diao)用它(ta)的(de)組(zu)件(jian)會(hui)假定它(ta)已失敗并(bing)需要(yao)自(zi)行(xing)采(cai)取適當的(de)措施。如果組(zu)件(jian)本身檢(jian)測到它(ta)無法維護其SLA,它(ta)可(ke)以先發制人(ren)地告訴其調(diao)用者暫(zan)停并(bing)稍后再(zai)來調(diao)用。為(wei)(wei)了保持整體系統健康,最好(hao)是(shi)快(kuai)速(su)失敗而不是(shi)在違(wei)反SLA的(de)情況下成功。兩(liang)個組(zu)件(jian)(一(yi)個被(bei)喚起(qi)的(de)和一(yi)個喚起(qi)的(de))都必須為(wei)(wei)此設置機制。
(1)保護調用者
A、超時(shi):如果(guo)被調用(yong)(yong)的(de)組件(jian)在其SLA內(nei)沒(mei)有響應,調用(yong)(yong)者(zhe)必須超時(shi)(放棄)并(bing)改用(yong)(yong)一些回退機(ji)制(即使它拋出錯(cuo)誤)來(lai)維(wei)護自(zi)己的(de)SLA并(bing)防(fang)止一連串的(de)SLA違規(gui)。
B、重試:由于網絡不可靠,分布式系統中的(de)(de)許多錯誤只(zhi)是隨機(ji)的(de)(de)。如果(guo)調用(yong)(yong)者(zhe)自己的(de)(de)SLA允許,調用(yong)(yong)者(zhe)可以重試該操(cao)作。重試的(de)(de)前(qian)提是操(cao)作的(de)(de)冪(mi)等性。即(ji)(ji)它(ta)不應(ying)該改變狀態或只(zhi)做一次,即(ji)(ji)使(shi)它(ta)被調用(yong)(yong)了兩次。
C、斷路(lu)器:如果對組件的(de)調(diao)(diao)(diao)(diao)用(yong)連續失敗,調(diao)(diao)(diao)(diao)用(yong)者可以(yi)通過“打(da)開電路(lu)”切斷連接并停止調(diao)(diao)(diao)(diao)用(yong)一段時間。由于調(diao)(diao)(diao)(diao)用(yong)者已經(jing)有(you)一些(xie)錯(cuo)誤場景的(de)備份行為,這(zhe)節省了調(diao)(diao)(diao)(diao)用(yong)者寶貴的(de)資源,這(zhe)些(xie)資源本(ben)來會被(bei)浪費掉(diao)。停止調(diao)(diao)(diao)(diao)用(yong)還(huan)可以(yi)減少(shao)被(bei)調(diao)(diao)(diao)(diao)用(yong)組件的(de)負載,并給(gei)它一些(xie)恢(hui)復(fu)的(de)喘息空(kong)間。
(2)保護被調用
A、隨(sui)(sui)機間隔:雖然重(zhong)試可以(yi)減少錯誤,但在(zai)一個頻繁(fan)使用的組件(jian)(jian)中出現一個小的性(xing)能(neng)問(wen)題可能(neng)會導致其所有調(diao)用者一次重(zhong)試。這種(zhong)“重(zhong)試風暴(bao)”會造成負載峰值并阻止該組件(jian)(jian)恢復。為(wei)了防止這種(zhong)情況,重(zhong)試應該在(zai)它們之(zhi)間有一個隨(sui)(sui)機的時間間隔,以(yi)便交錯加(jia)載。
B、背(bei)壓:如果一個組件(jian)檢測到自己承受過多(duo)的負載并且即將違反其SLA,它(ta)可(ke)以搶先開(kai)始丟棄新(xin)請(qing)求(qiu)(qiu),直(zhi)到其性能得到控制。這比接受它(ta)知道(dao)它(ta)不能在(zai)SLA內提供服務或沒有完全崩(beng)潰(kui)風險的請(qing)求(qiu)(qiu)要好得多(duo)。
3、在系統中建立緩沖區
(1)異步通信
消息總線之類的(de)異步通(tong)信(xin)通(tong)道允(yun)許調用(yong)遠程組件,而無需非常嚴格的(de)SLA依(yi)賴。通(tong)過讓被(bei)調用(yong)組件準備好而不是立即使用(yong)消息,系統對增(zeng)加的(de)工作負載的(de)需求變得更加靈活。
(2)彈性配置
可(ke)擴展(zhan)性最(zui)終歸(gui)結為充(chong)分利用可(ke)用硬(ying)件。但(dan)是,如果(guo)看到規模(mo)增長,讓(rang)系統緩(huan)口氣的(de)一個簡單方法是分配更(geng)多硬(ying)件。雖然這僅在我們(men)能夠(gou)承受的(de)成(cheng)本范(fan)圍內(nei)是可(ke)行的(de),但(dan)它為我們(men)提供了抵(di)御不可(ke)預(yu)測的(de)負載變化的(de)最(zui)后一道(dao)防線。