Hystrix如何使用

整體要點圖

 

HystrixNetflix開源的一款容錯系統,能幫助使用者碼出具備強大的容錯能力和魯棒性的程序。

 

 

Q1: fallback實現方式有幾種?

 

繼承HystrixCommand/HystrixObservableCommand 、HystrixCommand VS HystrixObservableCommand

 

HystrixCommand

HystrixObservableCommand

run()

construct()

創建的線程執行

調用程序線程執行

一個實例只能向調用程序發送(emit)單條數據

一個實例可以順序發送多條數據

execute()queue()observe()toObservable()

observe()toObservable()沒有execute()queue()

execute(以同步堵塞方式執行run()

 

queue():以異步非堵塞方式執行run()

 

observe():事件註冊前執行run()/construct()

observe():事件註冊前執行run()/construct()

toObservable():事件註冊後執行run()/construct()

toObservable():事件註冊後執行run()/construct()

 

 

Q2:什麼情況下會觸發fallback?

 

備註

Failure Type

Exception class

subject to fallback

方法拋異常

FAILURE

HystrixRuntimeException

YES

超時

TIMEOUT

HystrixRuntimeException

YES

在一定時間內,用戶請求超過一定的比例失敗時(timeout, failure, reject),斷路器就會打開;短路器打開後所有請求直接走fallback

SHORT_CIRCUITED

HystrixRuntimeException

YES

線程池滿reject,導致fallback

THREAD_POOL_REJECTED

HystrixRuntimeException

YES

信號量滿reject,導致fallback

SEMAPHORE_REJECTED

HystrixRuntimeException

YES

 

BAD_REQUEST

HystrixBadRequestException

NO

 

 

SHORT_CIRCUITED

在一定時間內,用戶請求超過一定的比例失敗時(timeout, failure, reject),斷路器就會打開;短路器打開後所有請求直接走fallback

參數設置

名稱

類型

含義

默認值

circuitBreakerEnabled

Boolean

是否啓用斷路器

true

circuitBreakerErrorThresholdPercentage

Integer

錯誤百分比,超過該值打開斷路器

50

circuitBreakerForceClosed

Boolean

強制斷路器打開

false

circuitBreakerForceOpen

Boolean

強制短路器關閉

false

circuitBreakerRequestVolumeThreshold

Integer

10s中內最少的請求量,大於該值,斷路器配置纔會生效

20

circuitBreakerSleepWindowInMilliseconds

Integer

短路器打開後多長時間嘗試關閉(Half open

5s

 

 

Q3:如何合併多個請求?

 

hystrix支持N個請求自動合併爲一個請求,這個功能在有網絡交互的場景下尤其有用,比如每個請求都要網絡訪問遠程資源,如果把請求合併爲一個,將使多次網絡交互變成一次,極大節省開銷。重要一點,兩個請求能自動合併的前提是兩者足夠“近”,即兩者啓動執行的間隔時長要足夠小,默認爲10ms,即超過10ms將不自動合併。

 

Q4:策略如何配置?

HystrixCommandProperties

 

* --------------統計相關------------------*/

// 統計滾動的時間窗口,默認: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.

 

HystrixCollapserProperties

 

//請求合併是允許的最大請求數,默認: Integer.MAX_VALUE  

private final HystrixProperty maxRequestsInBatch;  

//批處理過程中每個命令延遲的時間,默認:10毫秒  

private final HystrixProperty timerDelayInMilliseconds;  

//批處理過程中是否開啓請求緩存,默認:開啓  

private final HystrixProperty requestCacheEnabled;

 

HystrixThreadPoolProperties

 

/* 配置線程池大小,默認值10個 */

private final HystrixProperty corePoolSize;

/* 配置線程值等待隊列長度,默認值:-1 建議值:-1表示不等待直接拒絕,測試表明線程池使用直接決絕策略+ 合適大小的非回縮線程池效率最高.所以不建議修改此值。 當使用非回縮線程池時,queueSizeRejectionThreshold,keepAliveTimeMinutes 參數無效 */

private final HystrixProperty maxQueueSize;

 

 

參考文獻

 

https://www.jianshu.com/p/b9af028efebb

https://www.cnblogs.com/gaoyanqing/p/7470085.html

 

 

 

 

 

發佈了147 篇原創文章 · 獲贊 41 · 訪問量 72萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章