首页 > 解决方案 > 每次请求重试 Akka HTTP 请求的速度都会呈指数级增长

问题描述

为什么下面的代码需要大约一分钟才能完成?我究竟做错了什么?

  implicit val actors = ActorSystem("request")
  val config = ClientConnectionSettings(actors).withConnectingTimeout(5.seconds)
  val settings = ConnectionPoolSettings(actors).withConnectionSettings(config).withMaxRetries(0)

  def req(attempt: Int = 1) {
    implicit val ec: ExecutionContextExecutor = ExecutionContext.global
    println(s"[${LocalDateTime.now}] Running ${attempt}:")
    Http()(actors)
      .singleRequest(settings = settings, request = HttpRequest(uri = Uri("http://x")))
      .onComplete {
        case Success(v) =>
          println(s"[${LocalDateTime.now}]   ${v.toString}")
        case Failure(x) =>
          println(s"[${LocalDateTime.now}]   ${x.getCause.toString}")
          if (attempt < 10)
            req(attempt + 1)
      }
  }

  req()

输出(注意时间戳):

[2020-12-03T16:39:15.044092200] Running 1:
[2020-12-03T16:39:18.655240600]   java.net.UnknownHostException: x
[2020-12-03T16:39:18.655240600] Running 2:
[2020-12-03T16:39:18.804865900]   java.net.UnknownHostException: x
[2020-12-03T16:39:18.805865400] Running 3:
[2020-12-03T16:39:19.035596500]   java.net.UnknownHostException: x
[2020-12-03T16:39:19.035596500] Running 4:
[2020-12-03T16:39:19.525629100]   java.net.UnknownHostException: x
[2020-12-03T16:39:19.525629100] Running 5:
[2020-12-03T16:39:20.384635500]   java.net.UnknownHostException: x
[2020-12-03T16:39:20.384635500] Running 6:
[2020-12-03T16:39:22.166904400]   java.net.UnknownHostException: x
[2020-12-03T16:39:22.166904400] Running 7:
[2020-12-03T16:39:25.399605500]   java.net.UnknownHostException: x
[2020-12-03T16:39:25.399605500] Running 8:
[2020-12-03T16:39:34.705446800]   java.net.UnknownHostException: x
[2020-12-03T16:39:34.705446800] Running 9:
[2020-12-03T16:39:53.291327600]   java.net.UnknownHostException: x
[2020-12-03T16:39:53.291327600] Running 10:
[2020-12-03T16:40:23.490653800]   java.net.UnknownHostException: x

我是否需要增加一些连接限制或强制它们关闭或什么?

标签: scalaakka-http

解决方案


事实证明,解决方案是添加.withMaxConnectionBackoff(..)ConnectionPoolSettings, 因为这不仅会错开重试,还会错开在单个链中执行的所有请求。


推荐阅读