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