Миграция 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 метода самого низкого уровня:
CircuitBreaker.isCallPermitted
CircuitBreaker.onError
CircuitBreaker.onSuccess
То же самое верно и для других наших основных компонентов. Надеюсь, этот ответ поможет хоть немного. Если у вас есть другие вопросы, я буду рад помочь. Счастливого взлома