[英]Migrate HystrixCommands to Resilience4j
鑒於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更好地相像,但更為理智。 我真的不喜歡以Completable.complete()
開始鏈,只是這樣我可以在observeOn
實際的可調用observeOn
之前強制observeOn
。
我認為Resilience4j
不能直接替換HystrixCommand
。 最相似的是CircuitBreaker.decorateCompletionStage
或CircuitBreaker.executeCompletionStage
。 使用此方法,您可以裝飾CompletableFuture
供應商上的任何類型。 另一個選項是依靠我們與像不同的異步模塊集成rxjava2
或reactor
。 當然,如果所有這些選項都不適合您,請不要忘記Resilience4j
是非常簡單,模塊化和可組合的庫。 您可以使用3種最低級別的方法將我們的斷路器安裝在任何基於並發范式的庫中:
CircuitBreaker.isCallPermitted
CircuitBreaker.onError
CircuitBreaker.onSuccess
其他核心組件也是如此。 我希望這個答案至少能有所幫助。 如有其他疑問,我們將竭誠為您服務。 快樂黑客
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.