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