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