doc: 阅读CircuitBreaker文档
This commit is contained in:
@@ -203,3 +203,76 @@ CircuitBreaker支持3个特殊状态:
|
|||||||
对于Closed状态的CircuitBreaker而言,如果20个线程同时对cirbuitbreaker进行访问,那么所有的方法调用都能同时并行执行,即使滑动窗口的大小为`15`小于并行数量。`滑动窗口的大小不会对方法的并行程度造成影响`。
|
对于Closed状态的CircuitBreaker而言,如果20个线程同时对cirbuitbreaker进行访问,那么所有的方法调用都能同时并行执行,即使滑动窗口的大小为`15`小于并行数量。`滑动窗口的大小不会对方法的并行程度造成影响`。
|
||||||
|
|
||||||
如果想要对并行程度做出限制,可以使用`Bulkhead`。
|
如果想要对并行程度做出限制,可以使用`Bulkhead`。
|
||||||
|
|
||||||
|
### CircuitBreakerRegistry
|
||||||
|
resilence4j附带了一个`in-memory`的`CircuitBreakerRegistry`,基于`ConcurrentHashMap`实现。可以通过`CircuitBreakerRegistry`来管理(创建和获取)CircuitBreaker实例。可以按照如下示例,根据`默认的CircuitBreakerConfig`来创建`CircuitBreakerRegistry`:
|
||||||
|
```java
|
||||||
|
CircuitBreakerRegistry circuitBreakerRegistry =
|
||||||
|
CircuitBreakerRegistry.ofDefaults();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Create and configure CircuitBreakerConfig
|
||||||
|
除了使用默认的CircuitBreakerConfig外,还可以提供自定义的`CircuitBreakerConfig`,对象可以通过builder来构建。
|
||||||
|
|
||||||
|
`CircuitBreakerConfig`的可配置属性如下:
|
||||||
|
- `failureRateThreshold`:配置failure rate threshold的默认百分比
|
||||||
|
- `default value`: 50
|
||||||
|
- `description`:当failure rate`大于等于`该threshold值时,CircuitBreaker会切为`OPEN`状态,并开始`short-circuiting calls`
|
||||||
|
- `slowCallRateThreshold`:配置threshold百分比
|
||||||
|
- `default value`: 100
|
||||||
|
- `description`: 当slow calls的百分比等于或超过该threshold时,CircuitBreaker会切换到`OPEN`状态,并且开始short-circuiting calls
|
||||||
|
- `slowCallDurationThreshold`: 配置slow calls的duration threshold
|
||||||
|
- `default value`: 60000 [ms]
|
||||||
|
- `description`: 当call的耗时超过该duration threshold限制时,会被认定为slow call,并且会增加slow call rate
|
||||||
|
- `permittedNumberOfCallsInHalfOpenState`:
|
||||||
|
- `default value`: 10
|
||||||
|
- `description`:配置circuitbreaker切换到half open状态时,permitted calls的数量
|
||||||
|
- `maxWairDurationInfHalfOpenState`:
|
||||||
|
- `default value`: 0 [ms]
|
||||||
|
- `description`:配置`在CircuitBreaker从Half Open状态切换回Open状态前,其可以处于Half Open抓过你太的最长时间`。默认值为`0`,代表其等待时间没有上限,直到所有的permitted calls都执行完成
|
||||||
|
- `slidingWindowType`:配置滑动窗口的类型
|
||||||
|
- `default value`: `COUNT_BASED`
|
||||||
|
- `desceiption`:在CircuitBreaker处于closed状态时,滑动窗口用于记录调用的结果。滑动窗口类型可以是`count-based`和`time-based`
|
||||||
|
- `counted_based`:会记录最后`slidingWindowSize`个请求的结果并对其进行聚合
|
||||||
|
- `time_based`:会记录最后`slidingWindowSize`秒的调用结果,并且会对其进行聚合
|
||||||
|
- `slidingWindowSize`:
|
||||||
|
- `default value`: 100
|
||||||
|
- `description`:用于配置滑动窗口的大小
|
||||||
|
- `minimumNumberOfCalls`:
|
||||||
|
- `default value`:100
|
||||||
|
- `description`: 在可以计算error rate和slow call rate之前,至少需要记录`minimum number`个调用。例如,如果`minimumNumberOfCalls`为10,那么在可以计算failure rate前,必须至少记录10个calls(范围是整个滑动窗口期间范围内)。如果已经计算了9个calls,即使9个calls都调用失败,在记录的请求数达到`minimumNumberOfCalls`之前,也不会切换到open状态
|
||||||
|
- `waitDurationInOpenState`:
|
||||||
|
- `default value`: 60000 [ms]
|
||||||
|
- `description`:该值代表`处于OPEN状态的CircuitBreaker`在切换为`HALF-OPEN`之前,会等待的时间长度
|
||||||
|
- `automaticTransitionFromOpenToHalfOpenEnabled`:
|
||||||
|
- `default value`: false
|
||||||
|
- `description`:
|
||||||
|
- `如果该值设置为true`,会创建一个线程来对所有`CircuitBreakers`对象进行监控,并在waitDurationInOpenState设置的时间达到后将CircuitBreaker从Open切换到HALF_OPEN状态
|
||||||
|
- `如果该值设置为false(默认)`,那么`CircuitBreaker`从`OPEN`状态切换到`HALF_OPEN`状态的过程并不由专门的线程来触发,`而是由请求来触发`。如果该值设置为false(默认),即使`waitDurationInOpenState`设置的时间达到,如果没有后续请求,那么从`OPEN`到`HALF_OPEN`的变化也不会自动被触发
|
||||||
|
- `recordExceptions`:
|
||||||
|
- `default value`: empty
|
||||||
|
- `description`: 该属性用于配置exception list,位于该exception list中的异常类型将会被视为failure,并增加failure rate。
|
||||||
|
- 任何匹配或者继承exception list中的异常将会被视为failure,除非通过`ignoreExceptions`显式的忽略了该异常
|
||||||
|
- 如果通过`recordExcepions`指定了exception list,那么所有其他的异常都会被视为`success`,除非显式被`ignoreExceptions`指定
|
||||||
|
- `ignoreExceptions`:
|
||||||
|
- `default value`: empty
|
||||||
|
- `description`: 用于配置exception list,该list中配置的异常类型将会被忽略,既不会被记录为failure也不会被记录为success
|
||||||
|
- 任何匹配或者继承了该list中异常类型的异常将会被忽略,即使该异常在`recordExceptions`中被指定
|
||||||
|
- `recordFailurePredicate`:
|
||||||
|
- `default value`: throwable -> true
|
||||||
|
- `description`: 一个自定义的predicate,用于评估一个异常是否应该被记录为failure。如果该异常应当被记录为failure,那么该predicate应当返回true;如果该异常应当被记录为failure,那么该predicate应当返回false
|
||||||
|
- `ignoreExceptionPredicate`:
|
||||||
|
- `default value`: throwable -> false
|
||||||
|
- `description`: 一个自定义的predicate,用于评估一个异常是否应当被忽略或是记录为failure/success。
|
||||||
|
- 如果异常应当被忽略,那么该predicate应当返回true
|
||||||
|
- 如果异常不应该被忽略,predicate应当返回为false,该异常应该被视为failure/success
|
||||||
|
|
||||||
|
##### success/failure/ignore判断流程
|
||||||
|
在实际调用发生异常时,决定将异常视为success/failure/ignore的判断流程如下:
|
||||||
|
- 如果实际调用未抛出异常,则记录为调用成功,否则继续
|
||||||
|
- 如果抛出异常,首先会检查异常是否位于`Ignored Exceptions`中,如果位于其中,则忽略该异常,否则继续
|
||||||
|
- 如果ignoreExceptionPredicate不为空,根据该predicate进行判断,如果返回为true,则忽略该异常,否则继续
|
||||||
|
- 校验异常是否位于`recordExceptions`中,如果位于其中,则将其视为failure,否则继续
|
||||||
|
- 如果recordFailurePredicate不为空,根据`recordFailurePredicate`判断是否该异常应当被视为failure,如果返回为true,将其视为failure,否则继续
|
||||||
|
- 如果上述都不满足,那么将其视为success
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user