yanom blog

様々な技術について書きます

JavaでHTTPするときのRetryができるクライアントまとめ

個人用メモとして記事にしておきます。
httpのリクエストが500系エラーなどになった場合に、リトライ処理についてまとめます。

google http client

Exponential Backoff

ExponentialBackOff backoff = new ExponentialBackOff.Builder()
    .setInitialIntervalMillis(500)
    .setMaxElapsedTimeMillis(900000)
    .setMaxIntervalMillis(6000)
    .setMultiplier(1.5)
    .setRandomizationFactor(0.5)
    .build();
request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backoff));
  • 最大経過時間とインターバルの間でリトライを行う
  • リトライ回数は指定できない

Akka http

val responseFuture = Http().singleRequest(HttpRequest(method = requestMethod,
    uri = url,
    entity = HttpEntity(requestBody).withContentType(ContentTypes.`application/json`)
))


responseFuture.onComplete {
    case Success(r) =>
      if (r.status.isFailure()) Future.failed(new Exception("request failed with status 404"))
      else r
    case Failure(e) => throw e
}

def retryFuture[T](retries: Int, delay: FiniteDuration = 1.second)(fn: => Future[T])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = {
    fn.recoverWith {
      case _ if retries > 0 => after(delay, s)(retryFuture(retries - 1, delay)(fn))
    }
}
  • リトライ回数などある程度自由に制御できそう
  • Akka httpのライブラリが必要

自力で頑張る

  • 自由に制御できる反面バグなどを作り込む可能性が・・・

他にもあれば足していきます。(良いライブラリがあれば教えてください!)