什麼是Hystrix?
在一個分佈式系統裏,許多依賴不可避免的會調用失敗,比如超時、異常等,如何能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗雪崩,這個就是Hystrix需要做的事情。
hystrix功能
- 隔離(線程池隔離和信號量隔離):限制調用分佈式服務的資源使用,某一個調用的服務出現問題不會影響其他服務調用。
- 優雅的降級機制:超時降級、資源不足時(線程或信號量)降級,降級後可以配合降級接口返回託底數據。
- 熔斷:當失敗率達到閥值自動觸發降級(如因網絡故障/超時造成的失敗率高),熔斷器觸發的快速失敗會進行快速恢復。
- 緩存:提供了請求緩存、請求合併實現。
- 支持實時監控、報警、控制(修改配置)
隔離
線程池隔離 | 信號量隔離 | |
---|---|---|
線程 | 與調用線程非相同線程 | 與調用線程相同 |
開銷 | 排隊、調度、上下文開銷等 | 無線程切換,開銷低 |
異步 | 支持 | 不支持(無法削峯) |
併發支持 | 支持(最大線程池大小) | 支持(最大信號量上限) |
熔斷
正常狀態下,電路處於閉合狀態(Closed),如果調用持續出錯或者超時,電路被打開進入熔斷狀態(Open),後續一段時間內的所有調用都會被拒絕(Fail Fast),一段時間以後,保護器會嘗試進入半熔斷狀態(Half-Open),允許少量請求進來嘗試,如果調用仍然失敗,則回到熔斷狀態,如果調用成功,則回到電路閉合狀態;
降級
降級需要對下層依賴的業務分級,把產生故障的丟了,換一個輕量級的方案,是一種退而求其次的方法。
通常降級有:1.如果服務失敗,則我們通過fallback進行降級,返回靜態值。2.採用服務級聯的模式,如果第一個服務失敗,則調用備用服務,例如失敗重試或者訪問緩存失敗再去取數據庫。
hystrix應用
參數說明
參數類型 | 參數名 | 默認值 | 說明 |
---|---|---|---|
command配置 | executionIsolationStrategy | ExecutionIsolationStrategy.THREAD | 信號隔離或線程隔離,默認:採用線程隔離, |
executionIsolationThreadTimeoutInMillisecond | 1s | 隔離時間大,即多長時間後進行重試 | |
executionIsolationSemaphoreMaxConcurrentRequests | 10 | 使用信號量隔離時,命令調用最大的併發數,默認:10 | |
fallbackIsolationSemaphoreMaxConcurrentRequests | 10 | 使用信號量隔離時,命令fallback(降級)調用最大的併發數,默認:10 | |
fallbackEnabled | true | 是否開啓fallback降級策略 | |
executionIsolationThreadInterruptOnTimeout | true | 使用線程隔離時,是否對命令執行超時的線程調用中斷(Thread.interrupt())操作 | |
metricsRollingStatisticalWindowInMilliseconds | 10000ms | 統計滾動的時間窗口,默認:10s | |
metricsRollingStatisticalWindowBuckets | 10 | 統計窗口的Buckets的數量,默認:10個 | |
metricsRollingPercentileEnabled | true | 是否開啓監控統計功能,默認:true | |
requestLogEnabled | true | 是否開啓請求日誌 | |
requestCacheEnabled | true | 是否開啓請求緩存 | |
熔斷器配置 | circuitBreakerRequestVolumeThreshold | 20 | 主要用在小流量 |
circuitBreakerSleepWindowInMilliseconds | 5000ms | 熔斷器默認工作時間,默認:5秒.熔斷器中斷請求5秒後會進入半打開狀態,放部分流量過去重試 | |
circuitBreakerEnabled | true | 是否啓用熔斷器,默認true. 啓動 | |
circuitBreakerErrorThresholdPercentage | 50 | 默認:50%。當出錯率超過50%後熔斷器啓動 | |
circuitBreakerForceOpen | false | 是否強制開啓熔斷器阻斷所有請求,默認:false,不開啓 | |
circuitBreakerForceClosed | false | 是否允許熔斷器忽略錯誤,默認false, 不開啓 | |
線程池配置 | HystrixThreadPoolProperties.Setter().withCoreSize(int value) | 10 | 配置線程池大小,默認值10個 |
HystrixThreadPoolProperties.Setter().withMaxQueueSize(int value) | -1 | 配置線程值等待隊列長度 |