整體要點圖
Hystrix是Netflix開源的一款容錯系統,能幫助使用者碼出具備強大的容錯能力和魯棒性的程序。
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