分布式服务防雪崩熔断器,Hystrix理论+实战
Hystrix是什么?
hystrix對應(yīng)的中文名字是“豪豬”,豪豬周身長滿了刺,能保護(hù)自己不受天敵的傷害,代表了一種防御機(jī)制,這與hystrix本身的功能不謀而合,因此Netflix團(tuán)隊將該框架命名為Hystrix,并使用了對應(yīng)的卡通形象做作為logo。
在一個分布式系統(tǒng)里,許多依賴不可避免的會調(diào)用失敗,比如超時、異常等,如何能夠保證在一個依賴出問題的情況下,不會導(dǎo)致整體服務(wù)失敗,這個就是Hystrix需要做的事情。Hystrix提供了熔斷、隔離、Fallback、cache、監(jiān)控等功能,能夠在一個、或多個依賴同時出現(xiàn)問題時保證系統(tǒng)依然可用。
為什么需要Hystrix?
在大中型分布式系統(tǒng)中,通常系統(tǒng)很多依賴(HTTP,hession,Netty,Dubbo等),如下圖:
在高并發(fā)訪問下,這些依賴的穩(wěn)定性與否對系統(tǒng)的影響非常大,但是依賴有很多不可控問題:如網(wǎng)絡(luò)連接緩慢,資源繁忙,暫時不可用,服務(wù)脫機(jī)等。
如下圖:QPS為50的依賴 I 出現(xiàn)不可用,但是其他依賴仍然可用。
當(dāng)依賴I 阻塞時,大多數(shù)服務(wù)器的線程池就出現(xiàn)阻塞(BLOCK),影響整個線上服務(wù)的穩(wěn)定性.如下圖:
在復(fù)雜的分布式架構(gòu)的應(yīng)用程序有很多的依賴,都會不可避免地在某些時候失敗。高并發(fā)的依賴失敗時如果沒有隔離措施,當(dāng)前應(yīng)用服務(wù)就有被拖垮的風(fēng)險。
例如:一個依賴30個SOA服務(wù)的系統(tǒng),每個服務(wù)99.99%可用。 ?
99.99%的30次方 ≈ 99.7% ?
0.3% 意味著一億次請求 會有 3,000,00次失敗 ?
換算成時間大約每月有2個小時服務(wù)不穩(wěn)定. ?
隨著服務(wù)依賴數(shù)量的變多,服務(wù)不穩(wěn)定的概率會成指數(shù)性提高.
解決問題方案:對依賴做隔離,Hystrix就是處理依賴隔離的框架,同時也是可以幫我們做依賴服務(wù)的治理和監(jiān)控。
Netflix 公司開發(fā)并成功使用Hystrix,使用規(guī)模如下:
The Netflix API processes 10+ billion HystrixCommand executions per day using thread isolation. ?
Each API instance has 40+ thread-pools with 5-20 threads in each (most are set to 10).
Hystrix如何解決依賴隔離?
Hystrix使用命令模式HystrixCommand(Command)包裝依賴調(diào)用邏輯,每個命令在單獨(dú)線程中/信號授權(quán)下執(zhí)行。
可配置依賴調(diào)用超時時間,超時時間一般設(shè)為比99.5%平均時間略高即可.當(dāng)調(diào)用超時時,直接返回或執(zhí)行fallback邏輯。
為每個依賴提供一個小的線程池(或信號),如果線程池已滿調(diào)用將被立即拒絕,默認(rèn)不采用排隊.加速失敗判定時間。
依賴調(diào)用結(jié)果分:成功,失敗(拋出異常),超時,線程拒絕,短路。 請求失敗(異常,拒絕,超時,短路)時執(zhí)行fallback(降級)邏輯。
提供熔斷器組件,可以自動運(yùn)行或手動調(diào)用,停止當(dāng)前依賴一段時間(10秒),熔斷器默認(rèn)錯誤率閾值為50%,超過將自動運(yùn)行。
提供近實(shí)時依賴的統(tǒng)計和監(jiān)控。
Hystrix依賴的隔離架構(gòu),如下圖:
Hystrix應(yīng)用實(shí)戰(zhàn)
Maven:
<dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-core</artifactId><version>1.5.13</version> </dependency>源碼太多,不一一貼上來,這里只展示主要的測試源碼。
public static void main(String[] args) {System.out.println(test("javastack")); }private static String test(String name) {HystrixUtil.HystrixReqConfig hc = HystrixUtil.HystrixReqConfig.withGroupKey("TestGroup").withTimeout(3).withUnit(TimeUnit.SECONDS).withPassNum(64);String result = HystrixUtil.getExcuteResult(new HystrixCallableService<String>() {@Overridepublic String execute() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}return "success " + name;}@Overridepublic String fallback() {return "fallback " + name;}}, hc);return result;}這里設(shè)置了3秒超時進(jìn)入熔斷。
測試程序中休眠5秒,進(jìn)入熔斷器并輸出:
fallback javastack
測試程序中休眠2秒,進(jìn)入正常流程并輸出:
success javastack
熔斷器測試成功,即使某個服務(wù)出問題,也不會影響整個系統(tǒng)的正常運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的分布式服务防雪崩熔断器,Hystrix理论+实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springboot中mongodb的使
- 下一篇: SpringCloud配置中心高可用搭建