1. 雪崩效應(yīng)
- 在微服務(wù)架構(gòu)中突硝,我們將業(yè)務(wù)拆分成一個(gè)個(gè)的服務(wù)测摔,服務(wù)與服務(wù)之間可以相互調(diào)用,但是由于網(wǎng)絡(luò)
原因或者自身的原因狞换,服務(wù)并不能保證服務(wù)的100%可用,如果單個(gè)服務(wù)出現(xiàn)問(wèn)題舟肉,調(diào)用這個(gè)服務(wù)就會(huì)
出現(xiàn)網(wǎng)絡(luò)延遲修噪,此時(shí)若有大量的網(wǎng)絡(luò)涌入,會(huì)形成任務(wù)堆積路媚,最終導(dǎo)致服務(wù)癱瘓黄琼。
其實(shí),在單體服務(wù)中,高并發(fā)也會(huì)導(dǎo)致服務(wù)癱瘓脏款。見(jiàn)下一章围苫,Jmeter模擬微服務(wù)當(dāng)中的高并發(fā)場(chǎng)景 - 在分布式系統(tǒng)中,由于網(wǎng)絡(luò)原因或自身的原因,服務(wù)一般無(wú)法保證 100% 可用。如果一個(gè)服務(wù)出現(xiàn)了
問(wèn)題撤师,調(diào)用這個(gè)服務(wù)就會(huì)出現(xiàn)線程阻塞的情況剂府,此時(shí)若有大量的請(qǐng)求涌入,就會(huì)出現(xiàn)多條線程阻塞等
待剃盾,進(jìn)而導(dǎo)致服務(wù)癱瘓腺占。 -
由于服務(wù)與服務(wù)之間的依賴性,故障會(huì)傳播痒谴,會(huì)對(duì)整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果衰伯,這就是服務(wù)故障的 “雪崩效應(yīng)” 。見(jiàn)下圖示:
雪崩效應(yīng)圖示.png - 雪崩發(fā)生的原因多種多樣积蔚,有不合理的容量設(shè)計(jì)意鲸,或者是高并發(fā)下某一個(gè)方法響應(yīng)變慢,亦或是某
臺(tái)機(jī)器的資源耗盡尽爆。我們無(wú)法完全杜絕雪崩源頭的發(fā)生怎顾,只有做好足夠的容錯(cuò),保證在一個(gè)服務(wù)發(fā)生問(wèn)
題教翩,不會(huì)影響到其它服務(wù)的正常運(yùn)行杆勇。也就是"雪落而不雪崩"。
2. 微服務(wù)中常見(jiàn)的容錯(cuò)方案
要防止雪崩的擴(kuò)散饱亿,我們就要做好服務(wù)的容錯(cuò)蚜退,容錯(cuò)說(shuō)白了就是保護(hù)自己不被豬隊(duì)友拖垮的一些措施, 常見(jiàn)的服務(wù)容錯(cuò)思路有:
- 隔離
- 超時(shí)
- 限流
- 熔斷
- 降級(jí)
2.1 隔離
它是指將系統(tǒng)按照一定的原則劃分為若干個(gè)服務(wù)模塊,各個(gè)模塊之間相對(duì)獨(dú)立彪笼,無(wú)強(qiáng)依賴钻注。當(dāng)有故障發(fā)生時(shí),能將問(wèn)題和影響隔離在某個(gè)模塊內(nèi)部配猫,而不擴(kuò)散風(fēng)險(xiǎn)幅恋,不波及其它模塊,不影響整體的系統(tǒng)服務(wù)泵肄。常見(jiàn)的隔離方式有:線程池隔離和信號(hào)量隔離.
2.2 超時(shí)
在上游服務(wù)調(diào)用下游服務(wù)的時(shí)候捆交,設(shè)置一個(gè)最大響應(yīng)時(shí)間,如果超過(guò)這個(gè)時(shí)間腐巢,下游未作出反應(yīng)品追,
就斷開(kāi)請(qǐng)求,釋放掉線程冯丙。
2.3 限流
限流就是限制系統(tǒng)的輸入和輸出流量已達(dá)到保護(hù)系統(tǒng)的目的肉瓦。為了保證系統(tǒng)的穩(wěn)固運(yùn)行,一旦達(dá)到
的需要限制的閾值,就需要限制流量并采取少量措施以完成限制流量的目的。
2.4 熔斷
在互聯(lián)網(wǎng)系統(tǒng)中,當(dāng)下游服務(wù)因訪問(wèn)壓力過(guò)大而響應(yīng)變慢或失敗泞莉,上游服務(wù)為了保護(hù)系統(tǒng)整體的可用性哪雕,可以暫時(shí)切斷對(duì)下游服務(wù)的調(diào)用。這種犧牲局部鲫趁,保全整體的措施就叫做熔斷斯嚎。
服務(wù)熔斷一般有三種狀態(tài):
- 熔斷關(guān)閉狀態(tài)(Closed)
服務(wù)沒(méi)有故障時(shí),熔斷器所處的狀態(tài)饮寞,對(duì)調(diào)用方的調(diào)用不做任何限制 - 熔斷開(kāi)啟狀態(tài)(Open)
后續(xù)對(duì)該服務(wù)接口的調(diào)用不再經(jīng)過(guò)網(wǎng)絡(luò)孝扛,直接執(zhí)行本地的fallback方法 - 半熔斷狀態(tài)(Half-Open)
嘗試恢復(fù)服務(wù)調(diào)用,允許有限的流量調(diào)用該服務(wù)幽崩,并監(jiān)控調(diào)用成功率苦始。如果成功率達(dá)到預(yù)
期,則說(shuō)明服務(wù)已恢復(fù)慌申,進(jìn)入熔斷關(guān)閉狀態(tài)陌选;如果成功率仍舊很低,則重新進(jìn)入熔斷關(guān)閉狀
態(tài)蹄溉。
2.5 降級(jí)
降級(jí)其實(shí)就是為服務(wù)提供一個(gè)托底方案咨油,一旦服務(wù)無(wú)法正常調(diào)用,就使用托底方案柒爵。
3. 常見(jiàn)的容錯(cuò)組件
3.1 Hystrix
Hystrix是由Netflix開(kāi)源的一個(gè)延遲和容錯(cuò)庫(kù)役电,用于隔離訪問(wèn)遠(yuǎn)程系統(tǒng)、服務(wù)或者第三方庫(kù)棉胀,防止
級(jí)聯(lián)失敗法瑟,從而提升系統(tǒng)的可用性與容錯(cuò)性。
3.2 Resilience4J
Resilicence4J一款非常輕量唁奢、簡(jiǎn)單霎挟,并且文檔非常清晰、豐富的熔斷工具麻掸,這也是Hystrix官方推
薦的替代產(chǎn)品酥夭。不僅如此,Resilicence4j還原生支持Spring Boot 1.x/2.x脊奋,而且監(jiān)控也支持和
prometheus等多款主流產(chǎn)品進(jìn)行整合熬北。
3.3 Sentinel
Sentinel 是阿里巴巴開(kāi)源的一款斷路器實(shí)現(xiàn),本身在阿里內(nèi)部已經(jīng)被大規(guī)模采用诚隙,非常穩(wěn)定讶隐。
下面是三個(gè)組件在各方面的對(duì)比:
Sentinel | Hystrix | resilience4j | |
---|---|---|---|
隔離策略 | 信號(hào)量隔離(并發(fā)線程數(shù)限流) | 線程池隔離/信號(hào)量隔離 | 信號(hào)量隔離 |
熔斷降級(jí)策略 | 基于響應(yīng)時(shí)間、異常比率最楷、異常數(shù) | 基于異常比率 | 基于異常比率整份、響應(yīng)時(shí)間 |
實(shí)時(shí)統(tǒng)計(jì)實(shí)現(xiàn) | 滑動(dòng)窗口(LeapArray) | 滑動(dòng)窗口(基于 RxJava) | Ring Bit Buffer |
動(dòng)態(tài)規(guī)則配置 | 支持多種數(shù)據(jù)源 | 支持多種數(shù)據(jù)源 | 有限支持 |
擴(kuò)展性 | 多個(gè)擴(kuò)展點(diǎn) | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于調(diào)用關(guān)系的限流 | 有限的支持 | Rate Limiter |
流量整形 | 支持預(yù)熱模式籽孙、勻速器模式烈评、預(yù)熱排隊(duì)模式 | 不支持 | 簡(jiǎn)單的 Rate Limiter模式 |
系統(tǒng)自適應(yīng)保護(hù) | 支持 | 不支持 | 不支持 |
控制臺(tái) | 提供開(kāi)箱即用的控制臺(tái),可配置規(guī)則犯建、查看秒級(jí)監(jiān)控讲冠、機(jī)器發(fā)現(xiàn)等 | 簡(jiǎn)單的監(jiān)控查看 | 不提供控制臺(tái),可對(duì)接其它監(jiān)控系統(tǒng) |