簡體   English   中英

將HystrixCommands遷移到Resilience4j

[英]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.decorateCompletionStageCircuitBreaker.executeCompletionStage 使用此方法,您可以裝飾CompletableFuture供應商上的任何類型。 另一個選項是依靠我們與像不同的異步模塊集成rxjava2reactor 當然,如果所有這些選項都不適合您,請不要忘記Resilience4j是非常簡單,模塊化和可組合的庫。 您可以使用3種最低級別的方法將我們的斷路器安裝在任何基於並發范式的庫中:

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

其他核心組件也是如此。 我希望這個答案至少能有所幫助。 如有其他疑問,我們將竭誠為您服務。 快樂黑客

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM