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