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