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