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