繁体   English   中英

如何使用指数退避实现HttpRequestRetryHandler?

[英]How to implement HttpRequestRetryHandler with Exponential Backoff?

我希望在请求第一次失败的情况下为HttpClient实现HttpRequestRetryHandler

我还希望为后续重试实施指数退避 在数学上它可以实现为

E(c)= 1/2(2次幂(c)-1)

在此输入图像描述

但我现在很难在HttpRequestHtryHandler的代码中实现它。

HttpRequestRetryHandler不允许你那个级别的控制; 如果你想做一些非常具体的事情,我建议你实现类似Handler的东西,你可以用延迟执行Runnables,例如Handler.postDelayed()根据你的公式增加延迟。

Handler mHandler = new Handler();
int mDelay = INITIAL_DELAY;

// try request
mHandler.postDelayed(mDelay, new Runnable() {
   public void run() {
      // try your request here; if it fails, then repost:
      if (failed) {
          mDelay *= 2;  // or as per your formula
          mHandler.postDelayed(mDelay, this);
      }
      else {
          // success!
      }
   }
});

这是一个带退避算法的好框架 - https://github.com/rholder/guava-retrying

我使用guava-retrying来重试任意函数调用的策略。

我将它与我编写的库Guavaberry集成,其中包含几个等待策略,可以轻松构建一个固定的指数退避,并结合随机间隔(又称抖动): ExponentialJitterWaitStrategy

例如,建立一个上限为15秒的指数退避,并且可调用的抖动为50%:

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
        .retryIfResult(Predicates.isNull())
        .withWaitStrategy(WaitStrategies.exponentialJitterWait(Duration.ofSeconds(15), 0.5D))
        .build();
retryer.call(callable);

该库经过充分测试和记录,可以通过Maven Central轻松集成。

我希望这可以有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM