Автоматический выключатель Resilience4j, используемый с реактивным потоком, никогда не меняется на ОТКРЫТО при ошибках

Я оцениваю resilience4j, чтобы включить его в наши реактивные API, пока что я использую фиктивные Fluxes.

Служба ниже всегда терпит неудачу, поскольку я хочу проверить, ОТКРЫВАЕТ ли цепь множественные ошибки:

@Service
class GamesRepositoryImpl : GamesRepository {

    override fun findAll(): Flux<Game> {
        return if (Math.random() <= 1.0) {
            Flux.error(RuntimeException("fail"))
        } else {
            Flux.just(
                    Game("The Secret of Monkey Island"),
                    Game("Loom"),
                    Game("Maniac Mansion"),
                    Game("Day of the Tentacle")).log()
        }
    }
}

Это обработчик, который использует репозиторий, печатая состояние схемы:

@Component
class ApiHandlers(private val gamesRepository: GamesRepository) {

    var circuitBreaker : CircuitBreaker = CircuitBreaker.ofDefaults("gamesCircuitBreaker")

    fun getGames(serverRequest: ServerRequest) : Mono<ServerResponse> {
        println("*********${circuitBreaker.state}")
        return ok().body(gamesRepository.findAll().transform(CircuitBreakerOperator.of(circuitBreaker)), Game::class.java)
    }
}

Я вызываю конечную точку API много раз, всегда получая эту трассировку стека:

*********CLOSED
2018-03-14 12:02:28.153 ERROR 1658 --- [ctor-http-nio-3] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [GET http://localhost:8081/api/v1/games]

java.lang.RuntimeException: FAIL
    at com.codependent.reactivegames.repository.GamesRepositoryImpl.findAll(GamesRepositoryImpl.kt:12) ~[classes/:na]
    at com.codependent.reactivegames.web.handler.ApiHandlers.getGames(ApiHandlers.kt:20) ~[classes/:na]
    ...

2018-03-14 12:05:48.973 DEBUG 1671 --- [ctor-http-nio-2] i.g.r.c.i.CircuitBreakerStateMachine     : No Consumers: Event ERROR not published
2018-03-14 12:05:48.975 ERROR 1671 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [GET http://localhost:8081/api/v1/games]

java.lang.RuntimeException: fail
    at com.codependent.reactivegames.repository.GamesRepositoryImpl.findAll(GamesRepositoryImpl.kt:12) ~[classes/:na]
    at com.codependent.reactivegames.web.handler.ApiHandlers.getGames(ApiHandlers.kt:20) ~[classes/:na]
    at com.codependent.reactivegames.web.route.ApiRoutes$apiRouter$1$1$1.invoke(ApiRoutes.kt:14) ~[classes/:na]

Как видите, схема всегда ЗАКРЫТА. Я не знаю, имеет ли это какое-либо отношение, но обратите внимание на это сообщение No Consumers: Event ERROR not published,

Почему это не работает?


1 ответ

Решение

Проблема была по умолчанию ringBufferSizeInClosedState что составляет 100 запросов, и я никогда не делал так много ручных запросов.

Я настраиваю свою собственную CircuitBreakerConfig для моих тестов и теперь схема открывается сразу:

val circuitBreakerConfig : CircuitBreakerConfig = CircuitBreakerConfig.custom()
        .failureRateThreshold(50f)
        .waitDurationInOpenState(Duration.ofMillis(10000))
        .ringBufferSizeInHalfOpenState(5)
        .ringBufferSizeInClosedState(5)
        .build()
var circuitBreaker: CircuitBreaker = CircuitBreaker.of("gamesCircuitBreaker", circuitBreakerConfig)
Другие вопросы по тегам