重试 Akka HTTP 请求会随着每个请求呈指数级变慢
Retrying Akka HTTP requests gets exponentially slower with each request
为什么下面的代码需要大约一分钟才能完成?我做错了什么?
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
我需要增加一些连接限制或强制关闭它们还是什么?
事实证明,解决方案是将 .withMaxConnectionBackoff(..)
添加到 ConnectionPoolSettings
,因为这不仅会错开重试,还会错开在单个链中执行的所有请求。
为什么下面的代码需要大约一分钟才能完成?我做错了什么?
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
我需要增加一些连接限制或强制关闭它们还是什么?
事实证明,解决方案是将 .withMaxConnectionBackoff(..)
添加到 ConnectionPoolSettings
,因为这不仅会错开重试,还会错开在单个链中执行的所有请求。