中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java降級組件Hystrix的功能是什么

發布時間:2023-04-20 10:00:21 來源:億速云 閱讀:99 作者:iii 欄目:編程語言

這篇文章主要介紹“java降級組件Hystrix的功能是什么”,在日常操作中,相信很多人在java降級組件Hystrix的功能是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java降級組件Hystrix的功能是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    1、面試官:能簡單介紹下Hystrix有哪些功能嗎?

    問題分析:了解Hystrix的功能,同時也能從Hystrix優秀的設計理念中得到架構設計方面的啟發。

    答:我在項目里使用到,系統在 Hystrix 的保護下,可以長期處于高可用的狀態,常用的功能有以下幾點:

    1.1、fail-fast(快速失敗)

    Hystrix設計中提供了 fail-fast(快速失敗)和快速恢復機制。

    Tip:不知道之前你是否了解過fail-fast機制,或者面試Java基礎的時候,HashMap 中的 Iterator 迭代器,Iterator的設計就是 fail-fast 的,**快速失敗(fail—fast)**是Java集合中的一種機制, 在用迭代器遍歷一個集合對象時,如果遍歷過程中對集合對象的內容進行了修改(增加、刪除、修改),則會拋出Concurrent Modification Exception。

    我第一次學習 HashMap 并不是很懂 fail-fast,覺得快速失敗只是應用在Java集合類中,防止Java非線程安全集合的并發操作,學習使用 Hystrix 后,原來快速失敗機制還可以應用在系統架構設計中,對無法及時處理的請求快速失敗(fail-fast),降低系統負載,而不是排隊。

    1.2、Fallback優雅降級機制

    Fallback 字面意思是遇到Fall就啟動back,了解到Fallback的機制后,我馬上在項目中用起來。

    看真實例子:

     @Override
        @Degrade(key = "getOrderByParamFromES", fallBackMethod = "getOrderByParamFromMysql")
        public OrderResult getOrderByParamFromES(OrderSearchParam param) {
            //走ES查詢
            ......
            return OrderResult;
        }
     		//fallBack后調用getOrderByParamFromMysql方法
     		public OrderResult getOrderByParamFromMysql(OrderSearchParam param) {
            //走mysql查詢
            ......
            return OrderResult;
        }

    代碼解釋:

    fallBackMethod = "getOrderByParamFromMysql"

    就是在ES查詢故障失敗后,系統自動降級調getOrderByParamFromMysql方法,走mysql查詢,正常情況下,getOrderByParamFromMysql是不會被調用的,除非Fall。

    1.3、線程/信號量隔離機制
    線程隔離:

    請求會根據自己的key獲取對應線程池中的線程執行,動態設置線程池參數,這樣自然地將不同的請求隔離開來,支持異步來提高接口性能。不同請求直接不影響,例如service1請求緩慢,但是service2和service3還是可以正常工作,缺點就是線程切換影響性能。

    信號量隔離:

    一個請求中訪問了service1、service2、service3,其中service1請求超時,將導致整個信號量一直不釋放,其他請求一直無法接受。

    對于延遲小的請求(例如訪問緩存或者本地訪問數據庫)來說,線程池帶來的開銷是非常高的,你可以考慮采用其他方法,例如非阻塞信號量(不支持超時)來實現依賴服務的隔離。但絕大多數情況下,Netflix 更偏向于使用線程池來隔離依賴服務,因為其帶來的額外開銷可以接受,并且能支持包括超時在內的所有功能。

    2、面試官:剛剛說到線程隔離,那實際使用中是否打開超時線程中斷開關?

    問題分析:考察實際使用經驗,根據線程本身的特點,線程超時,如果不及時中斷,會浪費線程資源。

    答:一般情況下我們會打開超時中斷開關,目的是及時釋放線程資源。

    通過hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true 設置。

    但是如果是寫數據庫命令,或者記錄關鍵日志命令的情況下,需要命令執行完畢情況,可關閉超時中斷。

    (面試官點頭滿意,相信我確實有Hystrix的維護經驗)

    3、面試官:那你是如何估計線程池大小的?

    答:要正確設置線程池的大小,需要分析所部署系統的CPU個數、內存大小、任務類型(計算密集、IO密集等),對于計算密集型任務,線程池大小和CPU個數相近通常能實現最優利用率,對于IO密集型任務,線程池的最優大小的計算公式:線程池大小=CPU個數* (1 + 任務等待時間/ 任務處理時間)。

    深入分析

    Hystrix歷史

    Hystrix源自Netflix API團隊于2011年開始的項目。2012年,Hystrix不斷發展和成熟,Netflix內部的許多團隊都采用了它。如今,每天在Netflix上通過Hystrix執行數百億個線程隔離和數千億個信號量隔離的調用。這極大地提高了正常運行時間和彈性。

    在高并發訪問下,系統所依賴的服務的穩定性對系統的影響非常大,依賴有很多不可控的因素,比如網絡連接變慢,資源突然繁忙,暫時不可用,服務脫機等。我們要構建穩定、可靠的分布式系統,就必須要有這樣一套容錯方法。

    Hystrix的主要功能特性

    熔斷器機制:熔斷器可以理解成保險絲,項目里使用Hystrix Command,當 Hystrix Command請求后,如果服務失敗數量超過一定比例(比如默認50%),斷路器自動熔斷,該服務將進入熔斷狀態,后續請求都會進入fallback。

    降級機制:通過fallbackMethod注解,當請求后端服務出現異常的時候, 為了避免影響到其他業務邏輯,可以使用fallback方法指定的方法快速返回,或啟用“備胎方案”。

    環境隔離:包括線程隔離和信號量隔離。

    cache:Hystrix支持將一個請求結果緩存起來,下一個具有相同key的請求將直接從緩存中取出結果,減少請求開銷。

    Hystrix Demo

    通過一個demo快速理解Hystrix fallback 的使用

    @Service
    public class OrderQueryService {
         /**
         * 訂單查詢接口
         */
        @HystrixCommand(fallbackMethod = "queryOrderBack")
        public List<Order> queryOrderFromRedis(String userId) {
          // todo  reids查詢邏輯
          return orderlist;
        }
         /**
         * 訂單查詢接口失敗降級方案
         */
        @SuppressWarnings("unused")
        private String queryOrderBack(String userId) {
          // todo  如,走ES查詢邏輯  或者 直接提示用戶“請稍后再試”
          // todo 通知維護人員處理故障
          return "";
        }
    }

    代碼解釋:

    程序正常時,查詢訂單服務是走queryOrderFromRedis方法的邏輯,當queryOrderFromRedis方法拋出異常,根據設定的異常比例,或者指定哪個異常,達到閾值觸法fallback開關,程序切換到queryOrderBack,設置程序走ES查詢邏輯 或者 直接提示用戶“請稍后再試”,根據業務自行設置。

    哪些情況下會觸發fallback?

    Failure TypeException classException.cause觸發fallback
    FAILUREHystrixRuntimeExceptionunderlying exception (user-controlled)YES
    SEMAPHORE_REJECTEDHystrixRuntimeExceptionj.l.RuntimeExceptionYES
    SHORT_CIRCUITEDHystrixRuntimeExceptionj.l.RuntimeExceptionYES
    THREAD_POOL_REJECTEDHystrixRuntimeExceptionj.u.c.RejectedExecutionExceptionYES
    TIMEOUTHystrixRuntimeExceptionj.u.c.TimeoutExceptionYES

    FAILURE:任意RuntimeException異常都可以激活fallback。

    THREAD_POOL_REJECTED:并發執行的任務數超過線程池和隊列之和時,也就是Hystrix的線程隔離機制。

    SEMAPHORE_REJECTED:類似 THREAD_POOL_REJECTED ,當服務的并發數大于信號量閾值時將進入fallback。比如配置程序執行并發數不能大于3,由于信號量隔離下無論調用哪種命令執行方法,Hystrix都不會創建新線程執行run()/construct(),所以調用程序需要自己創建多個線程來模擬并發調用execute(),最后看到一旦并發線程>3,后續請求都進入fallback。

    SHORT_CIRCUITED:在一定時間內,用戶請求超過一定的比例失敗時,如超時,異常,線程并發達到限定最大值等,斷路器都會打開;短路器打開后所有請求直接走fallback,可以通過。circuitBreakerErrorThresholdPercentage方法設置百分比,默認是50。

    TIMEOUT:即超時請求。

    附錄:Hystrix策略配置

    /* --------------統計相關------------------*/ 
    // 統計滾動的時間窗口,默認:5000毫秒(取自circuitBreakerSleepWindowInMilliseconds)   
    private final HystrixProperty metricsRollingStatisticalWindowInMilliseconds;   
    // 統計窗口的Buckets的數量,默認:10個,每秒一個Buckets統計   
    private final HystrixProperty metricsRollingStatisticalWindowBuckets; // number of buckets in the statisticalWindow   
    // 是否開啟監控統計功能,默認:true   
    private final HystrixProperty metricsRollingPercentileEnabled;   
    /* --------------熔斷器相關------------------*/ 
    // 熔斷器在整個統計時間內是否開啟的閥值,默認20。也就是在metricsRollingStatisticalWindowInMilliseconds(默認10s)內至少請求20次,熔斷器才發揮起作用   
    private final HystrixProperty circuitBreakerRequestVolumeThreshold;   
    // 熔斷時間窗口,默認:5秒.熔斷器中斷請求5秒后會進入半打開狀態,放下一個請求進來重試,如果該請求成功就關閉熔斷器,否則繼續等待一個熔斷時間窗口
    private final HystrixProperty circuitBreakerSleepWindowInMilliseconds;   
    //是否啟用熔斷器,默認true. 啟動   
    private final HystrixProperty circuitBreakerEnabled;   
    //默認:50%。當出錯率超過50%后熔斷器啟動
    private final HystrixProperty circuitBreakerErrorThresholdPercentage;  
    //是否強制開啟熔斷器阻斷所有請求,默認:false,不開啟。置為true時,所有請求都將被拒絕,直接到fallback 
    private final HystrixProperty circuitBreakerForceOpen;   
    //是否允許熔斷器忽略錯誤,默認false, 不開啟   
    private final HystrixProperty circuitBreakerForceClosed; 
    /* --------------信號量相關------------------*/ 
    //使用信號量隔離時,命令調用最大的并發數,默認:10   
    private final HystrixProperty executionIsolationSemaphoreMaxConcurrentRequests;   
    //使用信號量隔離時,命令fallback(降級)調用最大的并發數,默認:10   
    private final HystrixProperty fallbackIsolationSemaphoreMaxConcurrentRequests; 
    /* --------------其他------------------*/ 
    //使用命令調用隔離方式,默認:采用線程隔離,ExecutionIsolationStrategy.THREAD   
    private final HystrixProperty executionIsolationStrategy;   
    //使用線程隔離時,調用超時時間,默認:1秒   
    private final HystrixProperty executionIsolationThreadTimeoutInMilliseconds;   
    //線程池的key,用于決定命令在哪個線程池執行   
    private final HystrixProperty executionIsolationThreadPoolKeyOverride;   
    //是否開啟fallback降級策略 默認:true   
    private final HystrixProperty fallbackEnabled;   
    // 使用線程隔離時,是否對命令執行超時的線程調用中斷(Thread.interrupt())操作.默認:true   
    private final HystrixProperty executionIsolationThreadInterruptOnTimeout; 
    // 是否開啟請求日志,默認:true   
    private final HystrixProperty requestLogEnabled;   
    //是否開啟請求緩存,默認:true   
    private final HystrixProperty requestCacheEnabled; // Whether request caching is enabled
    //請求合并是允許的最大請求數,默認: Integer.MAX_VALUE   
    private final HystrixProperty maxRequestsInBatch;   
    //批處理過程中每個命令延遲的時間,默認:10毫秒   
    private final HystrixProperty timerDelayInMilliseconds;   
    //批處理過程中是否開啟請求緩存,默認:開啟   
    private final HystrixProperty requestCacheEnabled; 
    /* 配置線程池大小,默認值10個 */ 
    private final HystrixProperty corePoolSize; 
    /* 配置線程值等待隊列長度,默認值:-1 建議值:-1表示不等待直接拒絕,測試表明線程池使用直接決絕策略+ 合適大小的非回縮線程池效率最高.所以不建議修改此值。 當使用非回縮線程池時,queueSizeRejectionThreshold,keepAliveTimeMinutes 參數無效 */
    private final HystrixProperty maxQueueSize;

    其他常用限流降級組件

    Sentinel:阿里巴巴集團內部基礎技術模塊,覆蓋了所有的核心場景。Sentinel 也因此積累了大量的流量歸整場景以及生產實踐。2018 年,Sentinel 開源,并持續演進。

    Resilience4j:也是一個輕量級的容錯組件,其靈感來自于 Hystrix,但主要為 Java 8 和函數式編程所設計。輕量級體現在其只用 Vavr庫(前身是 Javaslang),沒有任何外部依賴。而 Hystrix 依賴了 Archaius ,Archaius 本身又依賴很多第三方包,例如 Guava、Apache Commons Configuration 等。

    Sentinel 與 Hystrix resilience4j 對比


    SentinelHystrixresilience4j
    隔離策略信號量隔離(并發線程數限流)線程池隔離/信號量隔離信號量隔離
    熔斷降級策略基于響應時間、異常比率、異常數等異常比率模式、超時熔斷基于異常比率、響應時間
    實時統計實現滑動窗口(LeapArray)滑動窗口(基于 RxJava)Ring Bit Buffer
    動態規則配置支持多種配置源支持多種數據源有限支持
    擴展性豐富的 SPI 擴展接口插件的形式接口的形式
    基于注解的支持支持支持支持
    限流基于 QPS,支持基于調用關系的限流有限的支持Rate Limiter
    集群流量控制支持不支持不支持
    流量整形支持預熱模式、勻速排隊模式等多種復雜場景不支持簡單的 Rate Limiter 模式
    系統自適應保護支持不支持不支持
    控制臺提供開箱即用的控制臺,可配置規則、查看秒級監控、機器發現等簡單的監控查看不提供控制臺,可對接其它監控系統
    多語言支持Java / C++JavaJava
    開源社區狀態活躍停止維護較活躍

    到此,關于“java降級組件Hystrix的功能是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    抚顺市| 远安县| 威远县| 铁岭市| 四子王旗| 宣汉县| 呈贡县| 禹州市| 海盐县| 丰原市| 渑池县| 乐都县| 巴彦县| 大埔县| 嘉义县| 彰化市| 临泉县| 东明县| 屯门区| 兴仁县| 施甸县| 遵义市| 双牌县| 紫金县| 钟祥市| 五河县| 嘉定区| 裕民县| 米脂县| 安陆市| 五大连池市| 讷河市| 富蕴县| 许昌县| 社会| 本溪市| 云浮市| 紫金县| 石泉县| 于都县| 理塘县|