一、分布式系統(tǒng)為什么具有健壯性
健壯性是指在異常和危險情況下系統(tǒng)生存的能力,分布式系統(tǒng)一般具有健壯性,這是因為:
1、分布式系統(tǒng)的處理和控制功能是分布的,任何站點發(fā)生的故障都不會給整個系統(tǒng)造成太大的影響。
2、當分布式系統(tǒng)中的設(shè)備出現(xiàn)故障時,可以通過容錯技術(shù)實現(xiàn)系統(tǒng)的重構(gòu),以保證系統(tǒng)的正常運行。
二、怎么構(gòu)建健壯的分布式系統(tǒng)
分布式系統(tǒng)一般都具有健壯性,不過面對越來越普遍隨機故障,如果系統(tǒng)構(gòu)建不當?shù)脑?,也會?dǎo)致系統(tǒng)運行出現(xiàn)問題,要構(gòu)建健壯的分布式系統(tǒng),主要注意以下幾點:
1、最小化組件間依賴
分布式系統(tǒng)的組件相互通信以獲取數(shù)據(jù)或功能。在這兩種情況下,我們都可以通過將數(shù)據(jù)/功能推送到調(diào)用組件而不是遠程訪問來減少連接需求。
構(gòu)建大規(guī)模分布式系統(tǒng)迫使我們放棄標準軟件工程的許多“最佳實踐”。要記住的關(guān)鍵是,當我們采用分布式系統(tǒng)的復(fù)雜性來實現(xiàn)可擴展性時,我們還需要盡可能地控制“分布”。
(1)重復(fù)數(shù)據(jù)
如果我們經(jīng)常從另一個組件訪問一些數(shù)據(jù),我們可以在我們的組件中復(fù)制它,而不必在運行時檢索它。這可以大大減少運行時依賴并幫助改善我們組件的延遲。
經(jīng)常訪問但有一定規(guī)律性變化的數(shù)據(jù)可以通過定期緩存刷新來臨時緩存。更改頻率更低或從不更改的數(shù)據(jù)(例如客戶姓名)可以直接存儲在我們的組件中。如果/當這些數(shù)據(jù)發(fā)生變化時,我們可能需要做一些額外的工作,但是這種增加的小開銷通常是值得的,因為它可以提高彈性。
(2)非規(guī)范化數(shù)據(jù)
非規(guī)范化是在組件內(nèi)發(fā)生的一種特殊形式的重復(fù)。如果我們使用關(guān)系數(shù)據(jù)存儲,我們可以通過在主實體中復(fù)制數(shù)據(jù)來降低查看多個實體的成本。本地化分散數(shù)據(jù)以獲得更好性能的原則也適用于此。
(3)庫
為了減輕另一個組件的功能依賴性,我們可以將遠程組件打包為庫并將其嵌入到我們的組件中。這并不總是可能的(它可能是用其他語言編寫的,或者太大而不能成為一個庫)并且會帶來一系列問題(功能的變化需要跨多個組件進行庫升級),但是如果功能很關(guān)鍵并且經(jīng)常被大規(guī)模訪問,這是打破組件間連接并使其成為本地的可行方法。
2、隔離錯誤
錯誤隔離很重要,原因有兩個。一是個別錯誤在分布式系統(tǒng)中更常見(許多移動部件的簡單功能)。另一個是,如果我們不能防止整個系統(tǒng)中的聯(lián)鎖錯誤,那么我們首先就失去了構(gòu)建復(fù)雜體的理由。
錯誤隔離的主要結(jié)構(gòu)是SLA。每個組件都聲明了一些質(zhì)量參數(shù),它將在執(zhí)行功能時得到尊重。這些參數(shù)可以包括延遲、錯誤率、并發(fā)性等。在此SLA之外,調(diào)用它的組件會假定它已失敗并需要自行采取適當?shù)拇胧H绻M件本身檢測到它無法維護其SLA,它可以先發(fā)制人地告訴其調(diào)用者暫停并稍后再來調(diào)用。為了保持整體系統(tǒng)健康,最好是快速失敗而不是在違反SLA的情況下成功。兩個組件(一個被喚起的和一個喚起的)都必須為此設(shè)置機制。
(1)保護調(diào)用者
A、超時:如果被調(diào)用的組件在其SLA內(nèi)沒有響應(yīng),調(diào)用者必須超時(放棄)并改用一些回退機制(即使它拋出錯誤)來維護自己的SLA并防止一連串的SLA違規(guī)。
B、重試:由于網(wǎng)絡(luò)不可靠,分布式系統(tǒng)中的許多錯誤只是隨機的。如果調(diào)用者自己的SLA允許,調(diào)用者可以重試該操作。重試的前提是操作的冪等性。即它不應(yīng)該改變狀態(tài)或只做一次,即使它被調(diào)用了兩次。
C、斷路器:如果對組件的調(diào)用連續(xù)失敗,調(diào)用者可以通過“打開電路”切斷連接并停止調(diào)用一段時間。由于調(diào)用者已經(jīng)有一些錯誤場景的備份行為,這節(jié)省了調(diào)用者寶貴的資源,這些資源本來會被浪費掉。停止調(diào)用還可以減少被調(diào)用組件的負載,并給它一些恢復(fù)的喘息空間。
(2)保護被調(diào)用
A、隨機間隔:雖然重試可以減少錯誤,但在一個頻繁使用的組件中出現(xiàn)一個小的性能問題可能會導(dǎo)致其所有調(diào)用者一次重試。這種“重試風暴”會造成負載峰值并阻止該組件恢復(fù)。為了防止這種情況,重試應(yīng)該在它們之間有一個隨機的時間間隔,以便交錯加載。
B、背壓:如果一個組件檢測到自己承受過多的負載并且即將違反其SLA,它可以搶先開始丟棄新請求,直到其性能得到控制。這比接受它知道它不能在SLA內(nèi)提供服務(wù)或沒有完全崩潰風險的請求要好得多。
3、在系統(tǒng)中建立緩沖區(qū)
(1)異步通信
消息總線之類的異步通信通道允許調(diào)用遠程組件,而無需非常嚴格的SLA依賴。通過讓被調(diào)用組件準備好而不是立即使用消息,系統(tǒng)對增加的工作負載的需求變得更加靈活。
(2)彈性配置
可擴展性最終歸結(jié)為充分利用可用硬件。但是,如果看到規(guī)模增長,讓系統(tǒng)緩口氣的一個簡單方法是分配更多硬件。雖然這僅在我們能夠承受的成本范圍內(nèi)是可行的,但它為我們提供了抵御不可預(yù)測的負載變化的最后一道防線。