Миграция HystrixCommands в Resilience4j

Учитывая, что Hystrix переходит в режим обслуживания, я работаю над переносом (довольно большой) кодовой базы в Resilience4j.

Я интенсивно использую следующий шаблон с Hystrix:

new HystrixCommand<SomeReturnValue>(DependencyKeys.DEPENDENCY) {
    @Override
    protected SomeReturnValue run() {
        return someExpensiveCall();
    }
}
    .observe()

И я хочу повторить некоторые функции Hystrix с Resilience4j.

Пока у меня есть следующий синтаксис для подключения внешнего вызова:

resilience.single(DependencyKeys.DEPENDENCY, this::someExpensiveCall);

Где Resilience класс обеспечивает single метод:

public <T> Single<T> single(ResilienceKey key, Callable<T> callable) {
    return Completable.complete()
            .subscribeOn(Schedulers.computation())
            .observeOn(configuration.scheduler(key))
            .andThen(Single.defer(() -> Single.fromCallable(callable)
                    .lift(CircuitBreakerOperator.of(configuration.circuitBreaker(key)))
                    .lift(RateLimiterOperator.of(configuration.rateLimiter(key)))
                    .lift(BulkheadOperator.of(configuration.bulkhead(key)))
            ))
            .observeOn(Schedulers.computation());
}

Как это может выглядеть, чтобы лучше походить на то, что вы получаете с Hystrix, с точки зрения разрыва схемы и выполнения кода в разных пулах потоков, но более разумным способом. Я действительно не люблю начинать цепочку с Completable.complete() просто так я могу заставить observeOn до того, как фактический вызываемый объект обернут.

1 ответ

Я думаю, что нет прямой замены HystrixCommand в Resilience4j, Наиболее похожая вещь будет CircuitBreaker.decorateCompletionStage или же CircuitBreaker.executeCompletionStage, Используя эти методы, вы можете украсить любой тип на CompletableFuture поставщик. Другим вариантом будет полагаться на нашу интеграцию с различными асинхронными модулями, такими как rxjava2 или же reactor, И, конечно, если ни один из этих вариантов не подходит вам, пожалуйста, не забывайте, что Resilience4j это очень непопулярная, модульная и компонуемая библиотека. Вы можете установить наш автоматический выключатель в любую библиотеку с парадигмой параллелизма, используя наши 3 метода самого низкого уровня:

  1. CircuitBreaker.isCallPermitted
  2. CircuitBreaker.onError
  3. CircuitBreaker.onSuccess

То же самое верно и для других наших основных компонентов. Надеюсь, этот ответ поможет хоть немного. Если у вас есть другие вопросы, я буду рад помочь. Счастливого взлома

Другие вопросы по тегам