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