如何在 Resilience4J 中实现多个具有相同配置的断路器

Posted

技术标签:

【中文标题】如何在 Resilience4J 中实现多个具有相同配置的断路器【英文标题】:How to achieve multiple circuit breakers with same configuration in Resilience4J 【发布时间】:2020-08-27 07:16:27 【问题描述】:

我是 Resilience4J 的新手,正在尝试与 Spring boot 集成。

我的应用程序有几个远程系统调用。我希望所有远程调用都使用相同的断路器配置。

我正在使用 java 配置和功能样式来装饰远程调用,并使用 Resilience4J 运算符。目前,我为所有远程系统调用定义了一个断路器和一个重试 bean。

@Bean
    public CircuitBreakerConfig circuitBreakerConfig() 
        return CircuitBreakerConfig.custom().slidingWindowType(SlidingWindowType.COUNT_BASED).slidingWindowSize(6)
                .failureRateThreshold(50).waitDurationInOpenState(Duration.ofSeconds(10))
                .permittedNumberOfCallsInHalfOpenState(3).recordExceptions(HttpClientErrorException.class, HttpServerErrorException.class,TimeoutException.class,SdkClientException.class,AmazonServiceException.class,SQLException.class,JDBCException.class, DataAccessException.class).build();
    

    @Bean
    public CircuitBreaker circuitBreaker(CircuitBreakerConfig circuitBreakerConfig) 
        return CircuitBreaker.of("circuit-config", circuitBreakerConfig);
    

    @Bean
    public RetryConfig retryConfig() 
        return RetryConfig.custom().maxAttempts(3).waitDuration(Duration.ofMillis(1000))
                .retryExceptions(HttpClientErrorException.class, HttpServerErrorException.class,TimeoutException.class,SdkClientException.class,AmazonServiceException.class,SQLException.class,JDBCException.class, DataAccessException.class).build();
    

    @Bean
    public Retry retry() 
        return Retry.of("retry-config", retryConfig());
    

Decorators.ofRunnable(systemA::callA)
            .withCircuitBreaker(circuitBreaker)
            .withRetry(retry)
            .decorate()
            .run();

Decorators.ofRunnable(systemB::callB)
            .withCircuitBreaker(circuitBreaker)
            .withRetry(retry)
            .decorate()
            .run();

但我观察到,通过这种方式断路器(及其内部环形缓冲区)在系统 A 和系统 B 之间共享。因此,一个远程系统的故障正在影响另一个远程系统的故障阈值。

我需要为每个远程系统设置一个单独的断路器,以便维护每个远程系统的故障阈值。但是电路烧杯配置在远程系统中保持不变。

实现这一目标的最佳做法是什么?

【问题讨论】:

【参考方案1】:

您应该使用 Spring Boot 2 Starter 和外部配置。 然后将 CircuitBreakerRegistry 注入您的代码或使用注释。

【讨论】:

以上是关于如何在 Resilience4J 中实现多个具有相同配置的断路器的主要内容,如果未能解决你的问题,请参考以下文章

为啥在具有多个接口() 的对象中实现 QueryInterface() 时我需要显式向上转换

是否可以在 GraphQL 中实现多个接口?

多线程如何在 C 中实现?

多线程如何在 C 中实现?

如何在delphi中实现对文件进行base64编码

在graphql中实现多个接口