1 雪崩效應(yīng)
簡(jiǎn)單是來說,在分布式系統(tǒng)中沼本,假如有一個(gè)請(qǐng)求需要調(diào)用A服務(wù),但A服務(wù)出現(xiàn)了問題锭沟,則這個(gè)請(qǐng)求就會(huì)阻塞抽兆,那么只要調(diào)用服務(wù)A的請(qǐng)求都會(huì)阻塞,當(dāng)阻塞的請(qǐng)求越來越多族淮,占用的計(jì)算機(jī)資源就越來越多辫红。進(jìn)一步來說,就是一個(gè)服務(wù)出現(xiàn)問題祝辣,可能導(dǎo)致所有的請(qǐng)求都不可用贴妻,從而導(dǎo)致整個(gè)分布式系統(tǒng)都不可用,這就是“雪崩效應(yīng)”蝙斜。
如果要是考慮服務(wù)與服務(wù)之間的依賴關(guān)系名惩,則連帶作用更強(qiáng),系統(tǒng)崩壞的速度更快孕荠!
舉例來說:火車購(gòu)票系統(tǒng)提供兩種服務(wù)娩鹉,查票服務(wù)和訂票服務(wù)
- 如果不考慮兩個(gè)服務(wù)之間的依賴關(guān)系:查票服務(wù)出現(xiàn)問題,則查票的請(qǐng)求全部阻塞稚伍,占用大量的系統(tǒng)資源弯予,久而久之,導(dǎo)致整個(gè)系統(tǒng)無法響應(yīng)請(qǐng)求
- 如果考慮依賴關(guān)系:訂票服務(wù)依賴查票服務(wù)槐瑞,查票服務(wù)出現(xiàn)問題熙涤,不僅僅查票的請(qǐng)求會(huì)全部阻塞,訂票的服務(wù)也會(huì)阻塞,整個(gè)系統(tǒng)迅速崩壞祠挫!
2 Hystrix如何去解決雪崩
2.1 隔離技術(shù)
例如那槽,貨船為了進(jìn)行防止漏水和火災(zāi)的擴(kuò)散,會(huì)將貨倉分隔為多個(gè),如下圖所示:
- 線程池隔離
例如等舔,淘寶的一個(gè)商品頁面至少包含三方面信息骚灸,商品基本信息、商品價(jià)格慌植、買家評(píng)論甚牲。一個(gè)商品頁面的請(qǐng)求依賴于三個(gè)服務(wù),基本信息服務(wù)A蝶柿、價(jià)格服務(wù)B丈钙、評(píng)論服務(wù)C。因?yàn)槭且粋€(gè)請(qǐng)求(線程)調(diào)用三個(gè)服務(wù)交汤,調(diào)用順序?yàn)椋篈->B->C雏赦,如果其中A服務(wù)出現(xiàn)問題,則另外兩個(gè)服務(wù)都無法調(diào)用芙扎;如果B服務(wù)出現(xiàn)問題星岗,則C服務(wù)無法調(diào)用〗渫荩【橫向調(diào)用】
線程隔離主要解決的問題就是俏橘,A、B圈浇、C服務(wù)之間無調(diào)用順序的限制寥掐,不論哪個(gè)服務(wù)出現(xiàn)問題,都不會(huì)影響其他服務(wù)的調(diào)用磷蜀。但是前提是A曹仗、B、C服務(wù)之間相互獨(dú)立蠕搜。基本原理是,為每個(gè)服務(wù)維護(hù)一個(gè)線程池收壕,用戶的請(qǐng)求將不再直接訪問服務(wù)妓灌,而是通過線程池中的空閑線程來訪問服務(wù)。【縱向調(diào)用】
- 信號(hào)量隔離
該隔離技術(shù)蜜宪,是限制某個(gè)服務(wù)的并發(fā)數(shù)量虫埂,對(duì)服務(wù)的并發(fā)數(shù)量設(shè)置一個(gè)閾值,超過該閾值則服務(wù)暫停接受新的請(qǐng)求圃验。
2.2 熔斷機(jī)制
如果某個(gè)目標(biāo)服務(wù)調(diào)用慢或者有大量超時(shí)掉伏,如5秒內(nèi)20次調(diào)用失敗,此時(shí),熔斷該服務(wù)的調(diào)用斧散,對(duì)于后續(xù)調(diào)用請(qǐng)求供常,不在繼續(xù)調(diào)用目標(biāo)服務(wù),直接返回鸡捐,快速釋放資源栈暇。如果目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。熔斷機(jī)制在Hystrix中箍镜,位于隔離技術(shù)之前源祈。
1、判斷是否進(jìn)行熔斷的依據(jù)是:計(jì)算錯(cuò)誤率色迂,當(dāng)錯(cuò)誤率超過預(yù)設(shè)的值(默認(rèn)是50%)且10秒內(nèi)超過20個(gè)請(qǐng)求香缺,則開啟熔斷。
2歇僧、 對(duì)于被熔斷的請(qǐng)求图张,并不是永久被切斷,而是被暫停一段時(shí)間之后馏慨,允許部分請(qǐng)求通過埂淮,若請(qǐng)求都是健康的,則對(duì)請(qǐng)求健康恢復(fù)(取消熔斷)写隶,如果不是健康的倔撞,則繼續(xù)熔斷。
2.3 總執(zhí)行流程
- 首先判斷是否有緩存慕趴,如果有則直接返回結(jié)果
- 無緩存痪蝇,則判斷斷路器是否打開,如果打開則執(zhí)行回退方法冕房,返回結(jié)果
- 熔斷器未打開躏啰,則判斷線程池/信號(hào)量是否到底閾值,如果到達(dá)閾值耙册,則執(zhí)行回退方法给僵,返回結(jié)果
- 若未達(dá)到閾值,則執(zhí)行命令详拙,如果成功返回結(jié)果帝际;失敗返回回退方法的執(zhí)行結(jié)果
參考:
[1] Hystrix GitHub官網(wǎng):https://github.com/Netflix/Hystrix/wiki
[2] 楊恩雄-2017《瘋狂Spring Cloud微服務(wù)架構(gòu)實(shí)戰(zhàn)》