Hystrix 各個配置

簡介

發現不少使用Hystrix的同窗對Hystrix的理解都有一些問題,因此這裏嘗試用比較通俗易懂的方式來介紹一下Hystrix。git

首先使用Hystrix的經常使用目的:降級(限流),熔斷github

絕大多數時候咱們的資源是有限的,通常狀況下使用是沒有問題的,可是也會有流量高的時候。緩存

舉一個常見的例子:早上咱們去上班,若是早一點,路上的人車都比較少,你能夠隨便走,都沒有問題。可是當上班高峯期的時候,就會走走停停。當應用流量大的時候,狀況也就是想這樣的狀況。併發

解決辦法

  1. 依賴隔離:多少對依賴進行分組,使用不一樣的線程池。這就像咱們的車道劃分,咱們知道一個車道若是出了車禍,就很容易擁堵。是由於資源沒有劃分,你們都使用一個車道,若是一個車道出車禍,這個車道的車就會使用其餘的車道,讓流量更高,很容易出再問題。若是每一輛車只能在固定的車道行駛,就會好不少。ide

  2. 降級:就是對於一個指定的服務若是執行超時,或者在一段時間內請求超過多少直接是否fallback快速返回。相似於交警設卡每分鐘值容許多少車輛經過。函數

  3. 熔斷:對於一個服務若是調用失敗率達到一個指定的閾值,就直接拒絕服務。至關於交通管制,不讓過。ui

怎樣實現

這裏有一些點很重要,有助於咱們理解後面的一些配置。咱們知道要實現降級和熔斷須要一些統計信息。好比一個服務的執行時間,一個服務的失敗率等。線程

Hystrix怎樣知道這些信息呢?確定得和服務發生聯繫。Hystrix採用的方式是使用命令模式來封裝服務。日誌

HystrixCommand和HystrixObservableCommand就至關於命令角色(Command)。blog

ConcreteCommand(具體命令角色)須要咱們實現。

具體的服務就是扮演的Receiver角色

客服端就至關於Invoker角色

這樣就至關於在具體的服務外面包裝了一層,Hystrix就能夠在Command中爲服務分配線程,統計執行時間,統計服務失敗率等。

關於統計這裏還有2個重要的概念:時間窗口(metricsRollingStatisticalWindow)和段(bucket)

統計確定是有時間週期纔有意義,這個時間週期就叫作時間窗口。統計的服務失敗率就是時間窗口類的失敗率。默認的時間窗口是10000ms就是10秒。

舉個例子,假設咱們配置容許熔斷,熔斷的條件是服務調用失敗率爲80%,就表示10秒內: 調用這個服務失敗的次數/調用這個服務的總次數>=80% 就拒絕服務。

至於Bucket則涉及到更加底層的一些東西。時間窗口內不是指執行一次數據收集,而是把時間窗口t劃分爲n段,每段收集一次信息放在Bucket中。這個稍後介紹時間窗口的時候再詳細介紹。

Hystrix很容易上手,要應用很容易,隨便搜索一下都有不少,接下來咱們重點來看一下配置,看一下這些配置是怎樣影響應用的。

配置的默認值是在HystrixCommandProperties、HystrixCollapserProperties、HystrixThreadPoolProperties類中。

熔斷配置參數

circuitBreakerEnabled

是否容許熔斷,默認true

circuitBreakerRequestVolumeThreshold

判斷熔斷的最少請求數,默認是20,只有在一個統計窗口內處理的請求數量達到這個閾值,纔會進行是否熔斷的判斷

circuitBreakerErrorThresholdPercentage

判斷熔斷的閾值,默認值50,表示在一個統計窗口內有50%的請求處理失敗,會觸發熔斷 注意:circuitBreakerEnabled爲true,circuitBreakerErrorThresholdPercentage知足條件纔會觸發

circuitBreakerForceOpen

是否強制開啓熔斷器阻斷全部請求,默認false,若是爲true就會拒絕全部請求(服務調用)

circuitBreakerForceClosed

強制熔斷器進入closed狀態,默認false,若是是true,忽略錯誤百分比(circuitBreakerErrorThresholdPercentage)

優先級比circuitBreakerForceOpen低,也就是說circuitBreakerForceOpen設置爲true,circuitBreakerForceClosed這個設置就是無效的。

circuitBreakerSleepWindowInMilliseconds

熔斷時間,默認:5秒 當知足熔斷條件,熔斷器中斷請求5秒後會進入半打開狀態,放部分流量過去重試

執行配置參數

executionIsolationSemaphoreMaxConcurrentRequests

當隔離策略是ExecutionIsolationStrategy.SEMAPHORE,容許進入HystrixCommand.run()方法的最大併發請求數量。

executionIsolationStrategy

隔離策略,THREAD和SEMAPHORE 默認值: HystrixCommand: THREAD HystrixObservableCommand: SEMAPHORE

executionIsolationThreadInterruptOnTimeout

隔離執行,超時的時候是否中斷,默認true

executionTimeoutInMilliseconds

指定超時時間,單位毫秒。執行超過指定時間就執行fallback函數

executionTimeoutEnabled

執行的時候是否容許超時

executionIsolationThreadPoolKeyOverride

使用哪個線程池來執行(經過線程池名稱來標識哪個線程池來執行,沒有就建立)

fallbackIsolationSemaphoreMaxConcurrentRequests

HystrixCommand.getFallback()執行的最大併發數,若是超過直接拋出異常,而不是執行fallback,默認值10

fallbackEnabled

是否容許fallback

統計配置

metricsRollingStatisticalWindowInMilliseconds

熔斷統計時間窗口默認10秒,也就是說保留10秒的統計信息

metricsRollingStatisticalWindowBuckets

一個熔斷統計窗口中的Bucket數量,默認10個

Bucket

Bucket不是一個配置,這裏介紹Bucket幫助咱們理解上面2個配置,咱們先看一下Hystrix文檔的一張圖,有助於咱們理解。

hystrix_bucket

從上圖看,是一個事件窗口,總共有10個Bucket,每個Bucket中是一些統計的是1秒內的成功、失敗、超時、拒絕的信息。

這些信息能夠計算成功、失敗、超時的百分比,而後執行相應的策略。

下面2組有點像,可是差異很大: metricsRollingStatisticalWindowInMilliseconds和metricsRollingStatisticalWindowBuckets是和熔斷及線程池相關的

metricsRollingPercentileWindowInMilliseconds和metricsRollingPercentileWindowBuckets是和執行時間相關的

metricsRollingPercentileEnabled

是否開啓執行延遲統計,默認true,服務的執行延遲會被追蹤計算,若是是false所用統計均值百分比都會返回-1

metricsRollingPercentileWindowInMilliseconds

執行時間統計窗口,默認60s

metricsRollingPercentileWindowBuckets

執行時間統計窗口Bucket數量,默認6個

metricsRollingPercentileBucketSize

執行時間Bucket的最大值,最多保留的數量

metricsHealthSnapshotIntervalInMilliseconds

計算成功失敗百分比的時間間隔,默認500ms

requestCacheEnabled

是否開啓請求緩存,默認true

requestLogEnabled

是否開啓請求日誌,默認true

Collapser配置

maxRequestsInBatch

批量執行命令的最大值,默認Integer.MAX_VALUE

timerDelayInMilliseconds

批量執行命令之間的時間延遲,默認10ms

requestCacheEnabled

批量處理是否開啓執行緩存,默認true

線程池配置

coreSize

默認10

maximumSize

最大值,默認10

maxQueueSize

默認-1,使用 SynchronousQueue,若是是設置爲一個正數則使用LinkedBlockingQueue

queueSizeRejectionThreshold

最大排隊數量,默認5,若是maxQueueSize == -1這該參數無效

allowMaximumSizeToDivergeFromCoreSize

是否容許coreSize和maximumSize不一致,默認false

keepAliveTimeMinutes

1.5.9以前無效,由於coreSize 等於 maximumSize,1.5.9及以後,當allowMaximumSizeToDivergeFromCoreSize設置爲true的時候,而且coreSize < maximumSize,這個參數就是設置線程失效的時間。

Hystrix工做流程圖

最後來看一張Hystrix工做流程圖幫助咱們理解:

Hystrix流程圖

參考

Hystrix配置 Hystrix工做原理

相關文章
相關標籤/搜索