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