1. 設(shè)置超時
在應(yīng)用中設(shè)置服務(wù)調(diào)用的超時時間后,一旦線程的執(zhí)行時間超過了所設(shè)置的時間,就拋出異常信息,自動斷開連接,這樣服務(wù)的線程就不會都長時間僵死在調(diào)用異常的服務(wù)上,導(dǎo)致沒有空閑線程接收新的用戶請求,可以避免Service A因?yàn)檎{(diào)用Server E 異常而被拖垮,自身不可用。所以通過網(wǎng)絡(luò)調(diào)用外部依賴服務(wù)時,都必須設(shè)置超時。
2. 使用斷路器
斷路器大家都不陌生,家里電表在電流過載或者短路時就會跳閘,如果不跳閘,電路就不斷開,電線就會升溫,造成火災(zāi)。有了斷路器之后,電流過載時就會自動跳閘斷開電路,避免引起更大的災(zāi)難。
在程序中也是如此,當(dāng)知道服務(wù)調(diào)用某個依賴服務(wù)有大量超時的時候,再讓新的請求去訪問也只會超時,并不能得到想到的結(jié)果,還會消耗現(xiàn)有資源,增加負(fù)載,導(dǎo)致服務(wù)不可用。
這個時候使用斷路器就能避免這種資源浪費(fèi),在自身服務(wù)和依賴服務(wù)之間放一個斷路器,通過斷路器的監(jiān)控實(shí)時統(tǒng)計(jì)訪問的狀態(tài),當(dāng)訪問超時或者失敗達(dá)到某個閾值的時候(如50%請求超時,或者連續(xù)20次請失敗),就打開斷路器,那么后續(xù)的請求就直接返回失敗,而不是一個長時間的等待,再根據(jù)一個時間間隔(如30秒)或請求超時的情況(如0%的超時)嘗試關(guān)閉斷路器(或者更換保險絲),看依賴是否恢復(fù)服務(wù)了。
一個服務(wù)依賴多個服務(wù)時,如果其中一個非核心的依賴不可用,通過設(shè)置超時和使用斷路器,可以確保Service A在調(diào)用異常的Service E并不會導(dǎo)致自身的異常,在大部分情況下服務(wù)還能健康運(yùn)轉(zhuǎn),可以很好的做到依賴隔離。如下圖所示:

4)設(shè)置限流
在服務(wù)訪問的高峰期可能因?yàn)榇罅康牟l(fā)導(dǎo)致性能下降,嚴(yán)重時將會有大量的請求排隊(duì),可能會導(dǎo)致服務(wù)宕機(jī)。為了保證應(yīng)用的可用性,可拒絕低優(yōu)先級的調(diào)用,讓高優(yōu)先級的請求成功,避免所有調(diào)用都失敗的情況,并且為每個依賴服務(wù)提供一個小的線程池,如果線程池已滿調(diào)用將被立即拒絕,默認(rèn)不采用排隊(duì),可以加速失敗判定時間。這樣的結(jié)果是有些用戶可以訪問,而有些用戶失敗,但失敗的用戶重新訪問又可以是正常的訪問。這樣能確保服務(wù)的可用性,而不是完全不可用。
雖然有了上面的一些可提高系統(tǒng)可用性的措施,但系統(tǒng)是復(fù)雜的,一個簡單的修復(fù)都有可能造成不可想像的后果,且系統(tǒng)又是動態(tài)的,有些系統(tǒng)可能一天都發(fā)布幾次,幾十次。在這種情況下 故障依然是不可避免的。比起半夜深睡或正在享受節(jié)假日的美好時光時系統(tǒng)故障來當(dāng)救火隊(duì)員,會做更多的措施來提高系統(tǒng)的可用性。比如在某些企業(yè)里會定期舉行生產(chǎn)環(huán)境的故障應(yīng)急演練。
過去都是在業(yè)務(wù)低峰時進(jìn)行人為故障測試高可用方案是否生效,包括主機(jī),網(wǎng)絡(luò),應(yīng)用,存儲等每一層架構(gòu)都進(jìn)行演練,而現(xiàn)在也逐漸的在正常的生產(chǎn)時間進(jìn)行故障應(yīng)急演練,檢查系統(tǒng)的高可用性。問題在于可能在演練時能夠立即恢復(fù),但真實(shí)故障發(fā)生時還是會出現(xiàn)長時間故障得不到恢復(fù)的情況。一個是演練是按照已知的場景制定的方案實(shí)施,二是演練的范圍基本是高可用節(jié)點(diǎn)的切換或?yàn)?zāi)備系統(tǒng)的切換,第三個問題是這個演練是人為操作,需要全員的參與,并不會頻繁的舉行。但系統(tǒng)是動態(tài)的,這次是高可用的,不代表下周,或下個月還是高可用的。
當(dāng)單體架構(gòu)變成微服務(wù)架構(gòu)后,應(yīng)用層的演練就會變得復(fù)雜,就像前面提到的,如果每個服務(wù)只有一個故障可能都會有 2 100 種不同。因此需要有一種自動的故障測試方式來回避微服務(wù)化后演練實(shí)施的可操作性。
Netflix公司提出了一種自動故障測試的方案來提高微服務(wù)架構(gòu)的可用性。這個測試方案也是在生產(chǎn)環(huán)境中進(jìn)行,而故障測試的最終目的,是為了當(dāng)真的有故障發(fā)生時,生產(chǎn)環(huán)境不會停止服務(wù),并且整套系統(tǒng)可以在沒有人為干預(yù)的情況下,非常優(yōu)雅地通過降級將發(fā)生故障的部分組件排除出去。他們認(rèn)為如果只在測試環(huán)境中測試,而真實(shí)生產(chǎn)環(huán)境的業(yè)務(wù)壓力,業(yè)務(wù)場景,環(huán)境配置、網(wǎng)絡(luò)性能和硬件性能都沒有測試過,當(dāng)故障在生產(chǎn)環(huán)境中真實(shí)發(fā)生時發(fā)現(xiàn)緩解問題的方案可能會失效。而且這個測試只在工作時間運(yùn)行,這樣工程師可以得到告警并及時響應(yīng)。