了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng)
前言
微服務(wù)化產(chǎn)品線,每一個(gè)服務(wù)專心于自己的業(yè)務(wù)邏輯,并對外提供相應(yīng)的接口,看上去似乎很明了,其實(shí)還有很多的東西需要考慮,比如:服務(wù)的自動擴(kuò)充,熔斷和限流等,隨著業(yè)務(wù)的擴(kuò)展,服務(wù)的數(shù)量也會隨之增多,邏輯會更加復(fù)雜,一個(gè)服務(wù)的某個(gè)邏輯需要依賴多個(gè)其他服務(wù)才能完成。
一但一個(gè)依賴不能提供服務(wù)很可能會產(chǎn)生雪崩效應(yīng),最后導(dǎo)致整個(gè)服務(wù)不可訪問。
微服務(wù)之間進(jìn)行rpc或者h(yuǎn)ttp調(diào)用時(shí),我們一般都會設(shè)置調(diào)用超時(shí),失敗重試等機(jī)制來確保服務(wù)的成功執(zhí)行,看上去很美,如果不考慮服務(wù)的熔斷和限流,就是雪崩的源頭。
假設(shè)我們有兩個(gè)訪問量比較大的服務(wù)A和B,這兩個(gè)服務(wù)分別依賴C和D,C和D服務(wù)都依賴E服務(wù)

A和B不斷的調(diào)用C,D處理客戶請求和返回需要的數(shù)據(jù)。當(dāng)E服務(wù)不能供服務(wù)的時(shí)候,C和D的超時(shí)和重試機(jī)制會被執(zhí)行

由于新的調(diào)用不斷的產(chǎn)生,會導(dǎo)致C和D對E服務(wù)的調(diào)用大量的積壓,產(chǎn)生大量的調(diào)用等待和重試調(diào)用,慢慢會耗盡C和D的資源比如內(nèi)存或CPU,然后也down掉。

A和B服務(wù)會重復(fù)C和D的操作,資源耗盡,然后down掉,最終整個(gè)服務(wù)都不可訪問。

常見的導(dǎo)致雪崩的情況有以下幾種:
- 程序bug導(dǎo)致服務(wù)不可用,或者運(yùn)行緩慢
- 緩存擊穿,導(dǎo)致調(diào)用全部訪問某服務(wù),導(dǎo)致down掉
- 訪問量的突然激增。
- 硬件問題,這感覺只能說是點(diǎn)背了⊙︿⊙。
雖然雪崩效應(yīng)的產(chǎn)生千萬條,保證服務(wù)的不掛機(jī),和流暢運(yùn)行是我們不可推卸的責(zé)任,對應(yīng)雪崩效應(yīng)還是有很多保護(hù)方案的。
服務(wù)的橫向擴(kuò)充
現(xiàn)在我們可以利用很多工具來保證服務(wù)不會掛掉,然后流量比較大的時(shí)候,可以橫向擴(kuò)充服務(wù)來保證業(yè)務(wù)的流暢。比如我們最常使用k8s,能保證服務(wù)的運(yùn)行狀態(tài),也可以讓服務(wù)自動的橫向擴(kuò)充。對于用戶訪問量的激增情況這樣處理還是很不錯(cuò)的,但是,橫向擴(kuò)充也是有盡頭的,如果在一定環(huán)境下E服務(wù)的響應(yīng)時(shí)間過長,依然有可能導(dǎo)致雪崩效應(yīng)的產(chǎn)生。
限流
限制客戶端的調(diào)用來達(dá)到限流的做法是很常見的,比如,我們限制每秒最大處理200個(gè)請求,超過個(gè)數(shù)量直接拒絕請求。常見的算法如令牌桶算法
以一定的速度在桶里放令牌,當(dāng)客戶端請求服務(wù)的時(shí)候,要先從桶里得到令牌,才能被處理,如果桶里的令牌用完了,則拒絕訪問。

熔斷
在客戶端控制對依賴的訪問,如果調(diào)用的依賴不可用時(shí),則不再調(diào)用,直接返回錯(cuò)誤,或者降級處理。開源的庫比如hystrix-go,也是我接下來要寫的源碼分析的一個(gè)庫。很好的實(shí)現(xiàn)了熔斷和降級的功能。他的主要思想是,設(shè)置一些閥值,比如,最大并發(fā)數(shù),錯(cuò)誤率百分比,熔斷嘗試恢復(fù)時(shí)間等。能過這些閥值來轉(zhuǎn)換熔斷器的狀態(tài):
- 關(guān)閉狀態(tài),允許調(diào)用依賴
- 打開狀態(tài),不允許調(diào)用依賴,直接返回錯(cuò)誤,或者調(diào)用fallback
- 半開狀態(tài),根據(jù)熔斷嘗試恢復(fù)時(shí)間來開啟,允許調(diào)用依賴,如果調(diào)用成功則關(guān)閉失敗則繼續(xù)打開

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用get請求接收List集合數(shù)據(jù)(json)并導(dǎo)出報(bào)表問題
這篇文章主要介紹了Java使用get請求接收List集合數(shù)據(jù)(json)并導(dǎo)出報(bào)表問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
解決feign接口返回泛型設(shè)置屬性為null的問題
這篇文章主要介紹了解決feign接口返回泛型設(shè)置屬性為null的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java獲取環(huán)境變量(System.getenv)的方法
本文主要介紹了Java獲取環(huán)境變量(System.getenv)的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
詳解SpringBoot基礎(chǔ)之banner玩法解析
SpringBoot項(xiàng)目啟動時(shí)會在控制臺打印一個(gè)默認(rèn)的啟動圖案,這個(gè)圖案就是我們要講的banner,這篇文章主要介紹了SpringBoot基礎(chǔ)之banner玩法解析,感興趣的小伙伴們可以參考一下2019-04-04
SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題
這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

