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