Scala 超过配置的最大打开请求数

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,地址在响应的位置头中 负责下

最近,我开始使用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报告已经解决了。如果来这里的人仍然看到这些问题,我认为这可能取决于你如何处理你的回答(包括在超时的未来如何处理)。需要使用响应实体,否则背压将导致请求队列溢出。请阅读以下内容: