Миграция HystrixCommands в Resilience4j - PullRequest
0 голосов
/ 17 января 2019

Учитывая, что 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 Ответ

0 голосов
/ 20 января 2019

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

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

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

...