這篇文章主要介紹“java降級組件Hystrix的功能是什么”,在日常操作中,相信很多人在java降級組件Hystrix的功能是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java降級組件Hystrix的功能是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、道縣網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
問題分析:了解Hystrix的功能,同時也能從Hystrix優(yōu)秀的設(shè)計理念中得到架構(gòu)設(shè)計方面的啟發(fā)。
答:我在項目里使用到,系統(tǒng)在 Hystrix 的保護下,可以長期處于高可用的狀態(tài),常用的功能有以下幾點:
Hystrix設(shè)計中提供了 fail-fast(快速失?。┖涂焖倩謴?fù)機制。
Tip:不知道之前你是否了解過fail-fast機制,或者面試Java基礎(chǔ)的時候,HashMap 中的 Iterator 迭代器,Iterator的設(shè)計就是 fail-fast 的,**快速失敗(fail—fast)**是Java集合中的一種機制, 在用迭代器遍歷一個集合對象時,如果遍歷過程中對集合對象的內(nèi)容進行了修改(增加、刪除、修改),則會拋出Concurrent Modification Exception。
我第一次學(xué)習(xí) HashMap 并不是很懂 fail-fast,覺得快速失敗只是應(yīng)用在Java集合類中,防止Java非線程安全集合的并發(fā)操作,學(xué)習(xí)使用 Hystrix 后,原來快速失敗機制還可以應(yīng)用在系統(tǒng)架構(gòu)設(shè)計中,對無法及時處理的請求快速失?。╢ail-fast),降低系統(tǒng)負載,而不是排隊。
Fallback 字面意思是遇到Fall就啟動back,了解到Fallback的機制后,我馬上在項目中用起來。
看真實例子:
@Override @Degrade(key = "getOrderByParamFromES", fallBackMethod = "getOrderByParamFromMySQL") public OrderResult getOrderByParamFromES(OrderSearchParam param) { //走ES查詢 ...... return OrderResult; } //fallBack后調(diào)用getOrderByParamFromMysql方法 public OrderResult getOrderByParamFromMysql(OrderSearchParam param) { //走mysql查詢 ...... return OrderResult; }
代碼解釋:
fallBackMethod = "getOrderByParamFromMysql"
就是在ES查詢故障失敗后,系統(tǒng)自動降級調(diào)getOrderByParamFromMysql方法,走mysql查詢,正常情況下,getOrderByParamFromMysql是不會被調(diào)用的,除非Fall。
請求會根據(jù)自己的key獲取對應(yīng)線程池中的線程執(zhí)行,動態(tài)設(shè)置線程池參數(shù),這樣自然地將不同的請求隔離開來,支持異步來提高接口性能。不同請求直接不影響,例如service1請求緩慢,但是service2和service3還是可以正常工作,缺點就是線程切換影響性能。
一個請求中訪問了service1、service2、service3,其中service1請求超時,將導(dǎo)致整個信號量一直不釋放,其他請求一直無法接受。
對于延遲小的請求(例如訪問緩存或者本地訪問數(shù)據(jù)庫)來說,線程池帶來的開銷是非常高的,你可以考慮采用其他方法,例如非阻塞信號量(不支持超時)來實現(xiàn)依賴服務(wù)的隔離。但絕大多數(shù)情況下,Netflix 更偏向于使用線程池來隔離依賴服務(wù),因為其帶來的額外開銷可以接受,并且能支持包括超時在內(nèi)的所有功能。
問題分析:考察實際使用經(jīng)驗,根據(jù)線程本身的特點,線程超時,如果不及時中斷,會浪費線程資源。
答:一般情況下我們會打開超時中斷開關(guān),目的是及時釋放線程資源。
通過hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true 設(shè)置。
但是如果是寫數(shù)據(jù)庫命令,或者記錄關(guān)鍵日志命令的情況下,需要命令執(zhí)行完畢情況,可關(guān)閉超時中斷。
(面試官點頭滿意,相信我確實有Hystrix的維護經(jīng)驗)
答:要正確設(shè)置線程池的大小,需要分析所部署系統(tǒng)的CPU個數(shù)、內(nèi)存大小、任務(wù)類型(計算密集、IO密集等),對于計算密集型任務(wù),線程池大小和CPU個數(shù)相近通常能實現(xiàn)最優(yōu)利用率,對于IO密集型任務(wù),線程池的最優(yōu)大小的計算公式:線程池大小=CPU個數(shù)* (1 + 任務(wù)等待時間/ 任務(wù)處理時間)。
Hystrix源自Netflix API團隊于2011年開始的項目。2012年,Hystrix不斷發(fā)展和成熟,Netflix內(nèi)部的許多團隊都采用了它。如今,每天在Netflix上通過Hystrix執(zhí)行數(shù)百億個線程隔離和數(shù)千億個信號量隔離的調(diào)用。這極大地提高了正常運行時間和彈性。
在高并發(fā)訪問下,系統(tǒng)所依賴的服務(wù)的穩(wěn)定性對系統(tǒng)的影響非常大,依賴有很多不可控的因素,比如網(wǎng)絡(luò)連接變慢,資源突然繁忙,暫時不可用,服務(wù)脫機等。我們要構(gòu)建穩(wěn)定、可靠的分布式系統(tǒng),就必須要有這樣一套容錯方法。
熔斷器機制:熔斷器可以理解成保險絲,項目里使用Hystrix Command,當 Hystrix Command請求后,如果服務(wù)失敗數(shù)量超過一定比例(比如默認50%),斷路器自動熔斷,該服務(wù)將進入熔斷狀態(tài),后續(xù)請求都會進入fallback。
降級機制:通過fallbackMethod注解,當請求后端服務(wù)出現(xiàn)異常的時候, 為了避免影響到其他業(yè)務(wù)邏輯,可以使用fallback方法指定的方法快速返回,或啟用“備胎方案”。
環(huán)境隔離:包括線程隔離和信號量隔離。
cache:Hystrix支持將一個請求結(jié)果緩存起來,下一個具有相同key的請求將直接從緩存中取出結(jié)果,減少請求開銷。
通過一個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 ""; } }
代碼解釋:
程序正常時,查詢訂單服務(wù)是走queryOrderFromRedis方法的邏輯,當queryOrderFromRedis方法拋出異常,根據(jù)設(shè)定的異常比例,或者指定哪個異常,達到閾值觸法fallback開關(guān),程序切換到queryOrderBack,設(shè)置程序走ES查詢邏輯 或者 直接提示用戶“請稍后再試”,根據(jù)業(yè)務(wù)自行設(shè)置。
Failure Type | Exception class | Exception.cause | 觸發(fā)fallback |
---|---|---|---|
FAILURE | HystrixRuntimeException | underlying exception (user-controlled) | YES |
SEMAPHORE_REJECTED | HystrixRuntimeException | j.l.RuntimeException | YES |
SHORT_CIRCUITED | HystrixRuntimeException | j.l.RuntimeException | YES |
THREAD_POOL_REJECTED | HystrixRuntimeException | j.u.c.RejectedExecutionException | YES |
TIMEOUT | HystrixRuntimeException | j.u.c.TimeoutException | YES |
FAILURE
:任意RuntimeException異常都可以激活fallback。
THREAD_POOL_REJECTED
:并發(fā)執(zhí)行的任務(wù)數(shù)超過線程池和隊列之和時,也就是Hystrix的線程隔離機制。
SEMAPHORE_REJECTED
:類似 THREAD_POOL_REJECTED ,當服務(wù)的并發(fā)數(shù)大于信號量閾值時將進入fallback。比如配置程序執(zhí)行并發(fā)數(shù)不能大于3,由于信號量隔離下無論調(diào)用哪種命令執(zhí)行方法,Hystrix都不會創(chuàng)建新線程執(zhí)行run()/construct()
,所以調(diào)用程序需要自己創(chuàng)建多個線程來模擬并發(fā)調(diào)用execute()
,最后看到一旦并發(fā)線程>3,后續(xù)請求都進入fallback。
SHORT_CIRCUITED
:在一定時間內(nèi),用戶請求超過一定的比例失敗時,如超時,異常,線程并發(fā)達到限定最大值等,斷路器都會打開;短路器打開后所有請求直接走fallback,可以通過。circuitBreakerErrorThresholdPercentage方法設(shè)置百分比,默認是50。
TIMEOUT
:即超時請求。
/* --------------統(tǒng)計相關(guān)------------------*/ // 統(tǒng)計滾動的時間窗口,默認:5000毫秒(取自circuitBreakerSleepWindowInMilliseconds) private final HystrixProperty metricsRollingStatisticalWindowInMilliseconds; // 統(tǒng)計窗口的Buckets的數(shù)量,默認:10個,每秒一個Buckets統(tǒng)計 private final HystrixProperty metricsRollingStatisticalWindowBuckets; // number of buckets in the statisticalWindow // 是否開啟監(jiān)控統(tǒng)計功能,默認:true private final HystrixProperty metricsRollingPercentileEnabled; /* --------------熔斷器相關(guān)------------------*/ // 熔斷器在整個統(tǒng)計時間內(nèi)是否開啟的閥值,默認20。也就是在metricsRollingStatisticalWindowInMilliseconds(默認10s)內(nèi)至少請求20次,熔斷器才發(fā)揮起作用 private final HystrixProperty circuitBreakerRequestVolumeThreshold; // 熔斷時間窗口,默認:5秒.熔斷器中斷請求5秒后會進入半打開狀態(tài),放下一個請求進來重試,如果該請求成功就關(guān)閉熔斷器,否則繼續(xù)等待一個熔斷時間窗口 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; /* --------------信號量相關(guān)------------------*/ //使用信號量隔離時,命令調(diào)用最大的并發(fā)數(shù),默認:10 private final HystrixProperty executionIsolationSemaphoreMaxConcurrentRequests; //使用信號量隔離時,命令fallback(降級)調(diào)用最大的并發(fā)數(shù),默認:10 private final HystrixProperty fallbackIsolationSemaphoreMaxConcurrentRequests; /* --------------其他------------------*/ //使用命令調(diào)用隔離方式,默認:采用線程隔離,ExecutionIsolationStrategy.THREAD private final HystrixProperty executionIsolationStrategy; //使用線程隔離時,調(diào)用超時時間,默認:1秒 private final HystrixProperty executionIsolationThreadTimeoutInMilliseconds; //線程池的key,用于決定命令在哪個線程池執(zhí)行 private final HystrixProperty executionIsolationThreadPoolKeyOverride; //是否開啟fallback降級策略 默認:true private final HystrixProperty fallbackEnabled; // 使用線程隔離時,是否對命令執(zhí)行超時的線程調(diào)用中斷(Thread.interrupt())操作.默認:true private final HystrixProperty executionIsolationThreadInterruptOnTimeout; // 是否開啟請求日志,默認:true private final HystrixProperty requestLogEnabled; //是否開啟請求緩存,默認:true private final HystrixProperty requestCacheEnabled; // Whether request caching is enabled //請求合并是允許的最大請求數(shù),默認: 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 參數(shù)無效 */ private final HystrixProperty maxQueueSize;
其他常用限流降級組件
Sentinel
:阿里巴巴集團內(nèi)部基礎(chǔ)技術(shù)模塊,覆蓋了所有的核心場景。Sentinel 也因此積累了大量的流量歸整場景以及生產(chǎn)實踐。2018 年,Sentinel 開源,并持續(xù)演進。
Resilience4j
:也是一個輕量級的容錯組件,其靈感來自于 Hystrix,但主要為 Java 8 和函數(shù)式編程所設(shè)計。輕量級體現(xiàn)在其只用 Vavr庫(前身是 Javaslang),沒有任何外部依賴。而 Hystrix 依賴了 Archaius ,Archaius 本身又依賴很多第三方包,例如 Guava、Apache Commons Configuration 等。
Sentinel | Hystrix | resilience4j | |
---|---|---|---|
隔離策略 | 信號量隔離(并發(fā)線程數(shù)限流) | 線程池隔離/信號量隔離 | 信號量隔離 |
熔斷降級策略 | 基于響應(yīng)時間、異常比率、異常數(shù)等 | 異常比率模式、超時熔斷 | 基于異常比率、響應(yīng)時間 |
實時統(tǒng)計實現(xiàn) | 滑動窗口(LeapArray) | 滑動窗口(基于 RxJava) | Ring Bit Buffer |
動態(tài)規(guī)則配置 | 支持多種配置源 | 支持多種數(shù)據(jù)源 | 有限支持 |
擴展性 | 豐富的 SPI 擴展接口 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于調(diào)用關(guān)系的限流 | 有限的支持 | Rate Limiter |
集群流量控制 | 支持 | 不支持 | 不支持 |
流量整形 | 支持預(yù)熱模式、勻速排隊模式等多種復(fù)雜場景 | 不支持 | 簡單的 Rate Limiter 模式 |
系統(tǒng)自適應(yīng)保護 | 支持 | 不支持 | 不支持 |
控制臺 | 提供開箱即用的控制臺,可配置規(guī)則、查看秒級監(jiān)控、機器發(fā)現(xiàn)等 | 簡單的監(jiān)控查看 | 不提供控制臺,可對接其它監(jiān)控系統(tǒng) |
多語言支持 | Java / C++ | Java | Java |
開源社區(qū)狀態(tài) | 活躍 | 停止維護 | 較活躍 |
到此,關(guān)于“java降級組件Hystrix的功能是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
標題名稱:java降級組件Hystrix的功能是什么
URL標題:http://www.rwnh.cn/article32/pcopsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、關(guān)鍵詞優(yōu)化、域名注冊、網(wǎng)站設(shè)計、網(wǎng)站改版、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)