3

鉴于 Hystrix 进入维护模式,我一直致力于将(相当大的)代码库迁移到 Resilience4j。

我在 Hystrix 中大量使用了以下模式:

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

我想用 Resilience4j 复制一些 Hystrix 的功能。

到目前为止,我有以下语法来连接外部调用:

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 获得的东西,但是以更理智的方式。我真的不喜欢用 a 来启动链,这样我就可以在实际的可调用对象被包装之前Completable.complete()强制执行。observeOn

4

1 回答 1

2

我认为没有直接替换HystrixCommandin Resilience4j。最相似的事情是CircuitBreaker.decorateCompletionStageor CircuitBreaker.executeCompletionStage。使用这种方法,您可以装饰CompletableFuture供应商的任何类型。其他选择是依赖我们与不同异步模块的集成,例如rxjava2or reactor。当然,如果这些选项都不适合您,请不要忘记这Resilience4j是一个非常无主见的、模块化和可组合的库。通过使用我们的 3 个最低级别的方法,您可以将我们的断路器安装到任何类型的并发范例库中:

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

我们的其他核心组件也是如此。我希望这个答案至少有一点帮助。如果您有任何其他问题,我很乐意为您提供帮助。快乐的黑客

于 2019-01-20T12:42:01.867 回答