分散式服務防雪崩熔斷器,Hystrix理論+實戰。

架構師springboot發表於2018-12-02

Hystrix是什麼? hystrix對應的中文名字是“豪豬”,豪豬周身長滿了刺,能保護自己不受天敵的傷害,代表了一種防禦機制,這與hystrix本身的功能不謀而合,因此Netflix團隊將該框架命名為Hystrix,並使用了對應的卡通形象做作為logo。 在一個分散式系統裡,許多依賴不可避免的會呼叫失敗,比如超時、異常等,如何能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,這個就是Hystrix需要做的事情。Hystrix提供了熔斷、隔離、Fallback、cache、監控等功能,能夠在一個、或多個依賴同時出現問題時保證系統依然可用。 為什麼需要Hystrix? 在大中型分散式系統中,通常系統很多依賴(HTTP,hession,Netty,Dubbo等),如下圖:

分散式服務防雪崩熔斷器,Hystrix理論+實戰。
在高併發訪問下,這些依賴的穩定性與否對系統的影響非常大,但是依賴有很多不可控問題:如網路連線緩慢,資源繁忙,暫時不可用,服務離線等。

如下圖:QPS為50的依賴 I 出現不可用,但是其他依賴仍然可用。

分散式服務防雪崩熔斷器,Hystrix理論+實戰。
當依賴I 阻塞時,大多數伺服器的執行緒池就出現阻塞(BLOCK),影響整個線上服務的穩定性.如下圖:

分散式服務防雪崩熔斷器,Hystrix理論+實戰。
在複雜的分散式架構的應用程式有很多的依賴,都會不可避免地在某些時候失敗。高併發的依賴失敗時如果沒有隔離措施,當前應用服務就有被拖垮的風險。 例如:一個依賴30個SOA服務的系統,每個服務99.99%可用。
99.99%的30次方 ≈ 99.7%
0.3% 意味著一億次請求 會有 3,000,00次失敗
換算成時間大約每月有2個小時服務不穩定.
隨著服務依賴數量的變多,服務不穩定的概率會成指數性提高. 解決問題方案:對依賴做隔離,Hystrix就是處理依賴隔離的框架,同時也是可以幫我們做依賴服務的治理和監控。 Netflix 公司開發併成功使用Hystrix,使用規模如下:

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)包裝依賴呼叫邏輯,每個命令在單獨執行緒中/訊號授權下執行。 可配置依賴呼叫超時時間,超時時間一般設為比99.5%平均時間略高即可.當呼叫超時時,直接返回或執行fallback邏輯。 為每個依賴提供一個小的執行緒池(或訊號),如果執行緒池已滿呼叫將被立即拒絕,預設不採用排隊.加速失敗判定時間。 依賴呼叫結果分:成功,失敗(丟擲異常),超時,執行緒拒絕,短路。 請求失敗(異常,拒絕,超時,短路)時執行fallback(降級)邏輯。 提供熔斷器元件,可以自動執行或手動呼叫,停止當前依賴一段時間(10秒),熔斷器預設錯誤率閾值為50%,超過將自動執行。 提供近實時依賴的統計和監控。

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

分散式服務防雪崩熔斷器,Hystrix理論+實戰。
Hystrix應用實戰 Maven: com.netflix.hystrix hystrix-core 1.5.13

原始碼太多,不一一貼上來,這裡只展示主要的測試原始碼。

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;
}
複製程式碼

這裡設定了3秒超時進入熔斷。 測試程式中休眠5秒,進入熔斷器並輸出:

fallback javastack

測試程式中休眠2秒,進入正常流程並輸出:

success javastack

熔斷器測試成功,即使某個服務出問題,也不會影響整個系統的正常執行。

感興趣可以加Java架構師群獲取Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點高階進階乾貨的直播免費學習許可權 都是大牛帶飛 讓你少走很多的彎路的 群..號是:855801563 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!

相關文章