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