Exponential backoff is an algorithm that retries requests to the server based on certain status codes in the server response. The retries exponentially increase the waiting time up to a certain threshold. The idea is that if the server is down temporarily, it is not overwhelmed with requests hitting at the same time when it comes back up.
The exponential backoff feature of the Google HTTP Client Library for Java provides an easy way to retry on transient failures:
HttpUnsuccessfulResponseHandler
to
the HTTP request in question.HttpBackOffUnsuccessfulResponseHandler
implementation
to handle abnormal HTTP responses with some kind of BackOff
policy.ExponentialBackOff
for this backoff policy.Backoff is turned off by default in HttpRequest
. The examples below demonstrate
how to turn it on.
To set HttpRequest
to use HttpBackOffUnsuccessfulResponseHandler
with default values:
HttpRequest
request
=
...
request
.
setUnsuccessfulResponseHandler
(
new
HttpBackOffUnsuccessfulResponseHandler
(
new
ExponentialBackOff
()));
// HttpBackOffUnsuccessfulResponseHandler is designed to work with only one HttpRequest at a time.
// As a result, you MUST create a new instance of HttpBackOffUnsuccessfulResponseHandler with a new
// instance of BackOff for each instance of HttpRequest.
HttpResponse
=
request
.
execute
();
To alter the detailed parameters of ExponentialBackOff
, use its Builder
methods:
ExponentialBackOff
backoff
=
new
ExponentialBackOff
.
Builder
()
.
setInitialIntervalMillis
(
500
)
.
setMaxElapsedTimeMillis
(
900000
)
.
setMaxIntervalMillis
(
6000
)
.
setMultiplier
(
1.5
)
.
setRandomizationFactor
(
0.5
)
.
build
();
request
.
setUnsuccessfulResponseHandler
(
new
HttpBackOffUnsuccessfulResponseHandler
(
backoff
));
To create your own implementation of BackOff
:
class
CustomBackOff
implements
BackOff
{
@Override
public
long
nextBackOffMillis
()
throws
IOException
{
...
}
@Override
public
void
reset
()
throws
IOException
{
...
}
}
request
.
setUnsuccessfulResponseHandler
(
new
HttpBackOffUnsuccessfulResponseHandler
(
new
CustomBackOff
()));