这是我的代码

Future.sequence((2 to firstPage.pages).map
{ count =>
    getCommentPage(av, count)
}).map(//do something)

getCommentPage ,一个Http().singleRequest用于获取数据,如下所示:

val responseFuture: Future[HttpResponse] =
    Http(system).singleRequest(HttpRequest(GET, uri = requestUri))
responseFuture
    .map(_.entity)
    .flatMap(_.toStrict(10 seconds)(materializer))
    .map(_.data)
    .map(_.utf8String)
    .map((jsonString: String) => {
        //do something to extract data
    }

较小的firstPage.pages可以很好地工作,但是当firstPage.pages大(大约50或更大)时,会出现以下异常:

akka.stream.BufferOverflowException: Exceeded configured max-open-requests value of [32]. This means that the request queue of this pool (HostConnectionPoolSetup(api.bilibili.cn,80,ConnectionPoolSetup(ConnectionPoolSettings(4,0,5,32,1,30 seconds,ClientConnectionSettings(Some(User-Agent: akka-http/10.0.9),10 seconds,1 minute,512,None,<function0>,List(),ParserSettings(2048,16,64,64,8192,64,8388608,256,1048576,Strict,RFC6265,true,Full,Error,Map(If-Range -> 0, If-Modified-Since -> 0, If-Unmodified-Since -> 0, default -> 12, Content-MD5 -> 0, Date -> 0, If-Match -> 0, If-None-Match -> 0, User-Agent -> 32),false,akka.stream.impl.ConstantFun$$$Lambda$244/19208387@4780bf,akka.stream.impl.ConstantFun$$$Lambda$244/19208387@4780bf,akka.stream.impl.ConstantFun$$$Lambda$245/6903324@1d25a2e),None),TCPTransport),akka.http.scaladsl.HttpConnectionContext$@796a3e,akka.event.MarkerLoggingAdapter@1cc552a))) has completely filled up because the pool currently does not process requests fast enough to handle the incoming request load. Please retry the request later. See http://doc.akka.io/docs/akka-http/current/scala/http/client-side/pool-overflow.html for more information.

怎么解决呢?

#1楼 票数:1

您可以尝试类似

 val result = Source(1 to 10).mapAsyncUnordered(parallelism = 5) { count =>
    getCommentPage(av, count)
 }.runWith(Sink.seq)

请注意,并行度值应小于akka.http.host-connection-pool.max-connections

#2楼 票数:-1 已采纳

您正在寻找的是专用主机连接池 。简化后的结果代码如下所示:

val poolClientFlow =
    Http().cachedHostConnectionPool[HttpRequest](host, port)

def performRequest(request: HttpRequest): Future[HttpResponse] =
    Source
      .single(request)
      .via(poolClientFlow)
      .mapAsync(1) {
        case (response, _) =>
          Future.fromTry(response)
      }
      .runWith(Sink.head)

确保您会打电话

response.discardEntityBytes()

或只是取消编组以防止资源泄漏。

他们在文档中警告说这是一种反模式,但是如果您有足够的内存并且不需要任何队列管理,它实际上可以很好地运行。

#3楼 票数:-2

为什么不输入您的错误消息进入网站?

http://doc.akka.io/docs/akka-http/current/scala/http/client-side/pool-overflow.html

您需要使用akka.http.host-connection-pool.max-connections配置application.conf并将该数目从32增加到更高的数目。

  ask by Huang Yuheng translate from so

未解决问题?本站智能推荐:

1回复

Akka-http异常处理(Scala)

我正在使用Akka-hhtp(scala)将多个HTTP批处理请求异步发送到API,并想知道当响应代码不是200 OK时处理异常的正确方法是什么。 下面是一些伪代码来说明我的观点。 当我们收到不同于OK的StatusCodes时,以上代码将引发异常。 它确实通过了result.isEm
2回复

如何在akka演员中使用未来价值

我想在父子层次结构中使用 akka 演员,其中父母可以将最终计算结果发送到调用代码,这可能是/可能不是演员,这是我的用例父->子->子管理器 childManager 有三个工人演员(3 个孩子) childManager(worker1,worker2,worker3) 现在worke
2回复

使用akka-http和mongo-scala驱动程序

我想为我的休息服务使用akka-http和新的mongo-scala-driver 。 该代码有效 但是我想删除阻塞代码Await.result并编写异步代码。 我该怎么做? 谢谢 build.sbt: 更新 如果我更改代码: 我收到一个错误: 更新 如果我
2回复

如何停止处理akka流中的其他元素?

我有一个整数列表 {2,4,6,8,9,10,12} 为了简化我的问题,我的目标是获得所有偶数,直到遇到奇数。 所以我的结果应该是 -> {2,4,6,8, 9} 另外,我有一个演员说一个数字是偶数还是奇数(为简单起见) 我做了以下事情:- 那么,一旦我遇到一个奇怪的元素,我怎么能停止进一步元
1回复

PlayFramework2.7神秘的akka异常

我们使用的是 Play Framework 2.7 版,我们在日志中发现了一个看似随机的异常(见下文),但我们似乎无法将其追溯到我们的代码。 这是堆栈跟踪: 如您所见,没有对任何非播放代码的引用。 播放应用程序正常运行,但在功能上存在明显问题。 除了由于格式错误的配置文件(导致相同的堆栈跟踪但在不同
1回复

如何限制Akka演员一次只能做一份工作

我有一个基于Java-Akka的应用程序,其中一个Akka演员告诉另一个Akka演员执行某些作业,并且它在命令提示符下开始执行该作业,但是如果我给他10个作业,它将在10个命令提示符下一次启动所有作业。 如果我要拥有100多个工作,则我的系统将被挂起。 因此,如何使我的应用程序一次执行1个
1回复

在参与者之间发送AkkaHttpEntity

在akka-http中, HttpRequest和HttpResponse大多是不可变的对象,除了它们的HttpEntity主体(具有Source )。 向其他参与者(尤其是远程参与者)发送请求,响应或单独实体是否安全?是否需要采取一些预防措施?
1回复

从1.0移至2.0时,带有“application/xml”错误的HttpEntity

我没有很多关于akka的背景,但是HttpEntity处理字符串的方式有所改变吗? 我目前正在使用akka-http 1.0,但想升级到2.0并开始使用Source.queue功能。 我正在遵循此博客中概述的步骤, 这些步骤是我从类似的Stack Overflow问题中直接针对的。 我已