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