[英]How to implement HttpRequestRetryHandler with Exponential Backoff?
我希望在请求第一次失败的情况下为HttpClient实现HttpRequestRetryHandler 。
我还希望为后续重试实施指数退避 。 在数学上它可以实现为
但我现在很难在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.