Scala 超过配置的最大打开请求数
最近,我开始使用akka streams构建一些小型web处理服务。很简单,我从redis中提取URL,然后下载这些URL(它们是图像),稍后我处理图像,并将它们推送到s3,将一些json推送到redis 我从多个站点下载了很多不同类型的图像,我收到了一大堆错误,比如404、意外断开连接、响应内容长度17951202超过配置的限制8388608、EntityStreamException:实体流截断和重定向。使用重定向,我调用requestWithRedirects,地址在响应的位置头中 负责下载的部分大致如下:Scala 超过配置的最大打开请求数,scala,akka-stream,akka-http,Scala,Akka Stream,Akka Http,最近,我开始使用akka streams构建一些小型web处理服务。很简单,我从redis中提取URL,然后下载这些URL(它们是图像),稍后我处理图像,并将它们推送到s3,将一些json推送到redis 我从多个站点下载了很多不同类型的图像,我收到了一大堆错误,比如404、意外断开连接、响应内容长度17951202超过配置的限制8388608、EntityStreamException:实体流截断和重定向。使用重定向,我调用requestWithRedirects,地址在响应的位置头中 负责下
override lazy val http: HttpExt = Http()
def requestWithRedirects(request: HttpRequest, retries: Int = 10)(implicit akkaSystem: ActorSystem, materializer: FlowMaterializer): Future[HttpResponse] = {
TimeoutFuture(timeout, msg = "Download timed out!") {
http.singleRequest(request)
}.flatMap {
response => handleResponse(request, response, retries)
}.recoverWith {
case e: Exception if retries > 0 =>
requestWithRedirects(request, retries = retries - 1)
}
}
TimeoutFuture非常简单,它需要future和timeout。如果future花费的时间长于timeout,则返回其他future,并出现超时异常。
我遇到的问题是:过了一段时间,我出现了一个错误:
Message: RuntimeException: Exceeded configured max-open-requests value of [128] akka.http.impl.engine.client.PoolInterfaceActor$$anonfun$receive$1.applyOrElse in PoolInterfaceActor.scala::109
akka.actor.Actor$class.aroundReceive in Actor.scala::467
akka.http.impl.engine.client.PoolInterfaceActor.akka$stream$actor$ActorSubscriber$$super$aroundReceive in PoolInterfaceActor.scala::46
akka.stream.actor.ActorSubscriber$class.aroundReceive in ActorSubscriber.scala::208
akka.http.impl.engine.client.PoolInterfaceActor.akka$stream$actor$ActorPublisher$$super$aroundReceive in PoolInterfaceActor.scala::46
akka.stream.actor.ActorPublisher$class.aroundReceive in ActorPublisher.scala::317
akka.http.impl.engine.client.PoolInterfaceActor.aroundReceive in PoolInterfaceActor.scala::46
akka.actor.ActorCell.receiveMessage in ActorCell.scala::516
akka.actor.ActorCell.invoke in ActorCell.scala::487
akka.dispatch.Mailbox.processMailbox in Mailbox.scala::238
akka.dispatch.Mailbox.run in Mailbox.scala::220
akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec in AbstractDispatcher.scala::397
scala.concurrent.forkjoin.ForkJoinTask.doExec in ForkJoinTask.java::260
scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask in ForkJoinPool.java::1339
scala.concurrent.forkjoin.ForkJoinPool.runWorker in ForkJoinPool.java::1979
scala.concurrent.forkjoin.ForkJoinWorkerThread.run in ForkJoinWorkerThread.java::107
我不确定可能是什么问题,但我想我有一些下载没有正确完成,他们在一段时间后留在一些全球连接池中,导致上述错误。你知道是什么导致了这个问题吗?或者如何找到问题的根源:我已经测试了404个响应,响应内容长度超过了。。。错误,他们似乎不是我的麻烦制造者
编辑:
最有可能的问题是我未来的时间。我用这里描述的错误填充它,但在我看来,实际上下载一个映像永远不会完成,它占用了我的连接池资源
我想知道为什么这些设置对我的情况没有任何影响:
akka.http.client.connecting-timeout = 1 s
akka.http.client.idle-timeout = 1 s
akka.http.host-connection-pool.idle-timeout = 1 s
编辑2:
显然,目前还不支持超时。这是我的错误报告
这可能是一个bug,但如果不进一步隔离它发生的条件,就很难说了。这是一个老问题,bug报告已经解决了。如果来这里的人仍然看到这些问题,我认为这可能取决于你如何处理你的回答(包括在超时的未来如何处理)。需要使用响应实体,否则背压将导致请求队列溢出。阅读本文:这可能是一个bug,但是如果不进一步隔离它发生的条件,就很难说了。这是一个老问题,bug报告已经解决了。如果来这里的人仍然看到这些问题,我认为这可能取决于你如何处理你的回答(包括在超时的未来如何处理)。需要使用响应实体,否则背压将导致请求队列溢出。阅读本文:这可能是一个bug,但是如果不进一步隔离它发生的条件,就很难说了。这是一个老问题,bug报告已经解决了。如果来这里的人仍然看到这些问题,我认为这可能取决于你如何处理你的回答(包括在超时的未来如何处理)。需要使用响应实体,否则背压将导致请求队列溢出。请阅读以下内容: