Ben*_*ith 6 java reactive-programming hystrix rx-java2 resilience4j
鉴于 Hystrix 进入维护模式,我一直致力于将(相当大的)代码库迁移到 Resilience4j。
我在 Hystrix 中大量使用以下模式:
new HystrixCommand<SomeReturnValue>(DependencyKeys.DEPENDENCY) {
@Override
protected SomeReturnValue run() {
return someExpensiveCall();
}
}
.observe()
Run Code Online (Sandbox Code Playgroud)
我想用 Resilience4j 复制 Hystrix 的一些功能。
到目前为止,我有以下语法来连接外部调用:
resilience.single(DependencyKeys.DEPENDENCY, this::someExpensiveCall);
Run Code Online (Sandbox Code Playgroud)
其中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());
}
Run Code Online (Sandbox Code Playgroud)
在断路和在不同线程池上运行代码方面,这看起来如何更好地类似于 Hystrix,但以更理智的方式。我真的不喜欢用 just 来启动链,这样我就可以在实际的可调用对象被包装之前Completable.complete()强制使用 a 。observeOn
小智 3
我认为没有直接替代HystrixCommandin Resilience4j。最相似的是CircuitBreaker.decorateCompletionStageor CircuitBreaker.executeCompletionStage。使用此方法,您可以装饰CompletableFuture供应商上的任何类型。其他选择是依赖于我们与不同异步模块(如rxjava2或 )的集成reactor。当然,如果这些选项都不适合您,请不要忘记这Resilience4j是一个非常中立的、模块化的、可组合的库。您可以使用我们的 3 种最低级别的方法将我们的断路器安装在任何类型的并发范例库中:
CircuitBreaker.isCallPermittedCircuitBreaker.onErrorCircuitBreaker.onSuccess我们的其他核心组件也是如此。我希望这个答案至少有一点帮助。如果您还有任何其他问题,我很乐意为您提供帮助。快乐黑客
| 归档时间: |
|
| 查看次数: |
3543 次 |
| 最近记录: |