分佈式服務防雪崩熔斷器(Hystrix),實現服務降級

Hystrix是什麼?

hystrix對應的中文名字是「豪豬」,豪豬周身長滿了刺,能保護本身不受天敵的傷害,表明了一種防護機制,這與hystrix自己的功能不謀而合,所以Netflix團隊將該框架命名爲Hystrix,並使用了對應的卡通形象作做爲logo。html

在一個分佈式系統裏,許多依賴不可避免的會調用失敗,好比超時、異常等,如何可以保證在一個依賴出問題的狀況下,不會致使總體服務失敗,這個就是Hystrix須要作的事情。java

Hystrix提供了熔斷、隔離、Fallback、cache、監控等功能,可以在一個、或多個依賴同時出現問題時保證系統依然可用。segmentfault

 

爲何須要Hystrix?

在大中型分佈式系統中,一般系統不少依賴(HTTP,hession,Netty,Dubbo等),以下圖:服務器

 

 

在高併發訪問下,這些依賴的穩定性與否對系統的影響很是大,可是依賴有不少不可控問題:如網絡鏈接緩慢,資源繁忙,暫時不可用,服務脫機等。網絡

以下圖:QPS爲50的依賴 I 出現不可用,可是其餘依賴仍然可用。架構

當依賴I 阻塞時,大多數服務器的線程池就出現阻塞(BLOCK),影響整個線上服務的穩定性.以下圖:併發

 

在複雜的分佈式架構的應用程序有不少的依賴,都會不可避免地在某些時候失敗。高併發的依賴失敗時若是沒有隔離措施,當前應用服務就有被拖垮的風險框架

例如:一個依賴30個SOA服務的系統,每一個服務99.99%可用。 分佈式

99.99%的30次方 ≈ 99.7% ide

0.3% 意味着一億次請求 會有 3,000,00次失敗

換算成時間大約每個月有2個小時服務不穩定.

隨着服務依賴數量的變多,服務不穩定的機率會成指數性提升.

解決問題方案:對依賴作隔離,Hystrix就是處理依賴隔離的框架,同時也是能夠幫咱們作依賴服務的治理和監控。

 

Hystrix如何解決依賴隔離?

Hystrix使用命令模式HystrixCommand(Command)包裝依賴調用邏輯,每一個命令在單獨線程中/信號受權下執行。

可配置依賴調用超時時間,超時時間通常設爲比99.5%平均時間略高便可.當調用超時時,直接返回或執行fallback邏輯。

爲每一個依賴提供一個小的線程池(或信號),若是線程池已滿調用將被當即拒絕,默認不採用排隊.加速失敗斷定時間。

依賴調用結果分:成功,失敗(拋出異常),超時,線程拒絕,短路。 請求失敗(異常,拒絕,超時,短路)時執行fallback(降級)邏輯。

提供熔斷器組件,能夠自動運行或手動調用,中止當前依賴一段時間(10秒),熔斷器默認錯誤率閾值爲50%,超過將自動運行。

提供近實時依賴的統計和監控。

Hystrix依賴的隔離架構,以下圖:

 

Hystrix應用實戰
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>() {

        @Override
        public String execute() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "success " + name;
        }

        @Override
        public String fallback() {
            return "fallback " + name;
        }

    }, hc);

    return result;
}

 項目中的實際使用案例:

 

參考:

https://www.cnblogs.com/li3807/p/8780980.html

https://www.jianshu.com/p/3e11ac385c73?from=timeline

https://segmentfault.com/a/1190000012845088

https://www.colabug.com/2804676.html

https://blog.csdn.net/chengqiuming/article/details/81412510

https://blog.csdn.net/an88411980/article/details/80552973

https://hot66hot.iteye.com/blog/2155036

相關文章
相關標籤/搜索