scala - 每次请求重试 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
我是否需要增加一些连接限制或强制它们关闭或什么?
解决方案
事实证明,解决方案是添加.withMaxConnectionBackoff(..)
到ConnectionPoolSettings
, 因为这不仅会错开重试,还会错开在单个链中执行的所有请求。
推荐阅读
- laravel - 通过修剪函数将输入名称变量转换为在数据库中搜索
- elasticsearch - 在logstash中分离键值对
- javascript - 如何在 switch 语句中传递按钮 ID 以执行该按钮应该执行的任何功能?
- xamarin - Xamarin Forms:IOS 上的 Webview 自动打开 IFrame
- angular - “可观察”类型上不存在属性“distinctUntilChanged”
' - java - 如何在 java 中使用 REST/SOAP 获取联邦快递的跟踪详细信息?
- database - 在 laravel 5.4 中更新列值
- javascript - 使用 for 循环的 Javascript 倒计时
- xaml - Xamarin UI 测试:读出未使用 Repl 树命令(网格)显示的可见元素
- c - 在 Java JNI 回调函数中,获取 JNI env 的最佳方法是什么,因为它不像其他本机函数那样包含在函数签名中?