繁体   English   中英

使用play.api.libs.ws批处理请求

[英]Batching requests with play.api.libs.ws

我有一个脚本,它会发出很多Web请求(〜300000)。 看起来像这样

// Setup a new wsClient
val config = new NingAsyncHttpClientConfigBuilder(DefaultWSClientConfig()).build
val builder = new AsyncHttpClientConfig.Builder(config)
val wsClient = new NingWSClient(builder.build)

// Each of these use the wsClient
def getAs: Future[Seq[A]] = { ... }
def getBs: Future[Seq[B]] = { ... }
def getCs: Future[Seq[C]] = { ... }
def getDs: Future[Seq[D]] = { ... }

(for {
    as <- getAs
    bs <- getBs
    cs <- getCs
    ds <- getDs
} yield (as, bs, cs, ds)).map(tuple => println("done"))

问题是我将遇到Too many open files异常,因为每个函数都异步发出数千个请求,每个请求都使用一个文件描述符。

我尝试重新组织我的功能,以便每个人都可以使用自己的客户端进行批处理:

def getAs: Future[Seq[A]] = {
    someCollection.group(1000).map(batch => {
        val client = new NingWSClient(builder.build) // Make a new client for every batch
        Future.sequence(batch.map(thing => {
            wsClient.url(...).map(...)
        })).map(things => {
            wsClient.close // Close the client
            things
        })
    })
}

但这会导致对理解的提早结束(没有任何错误消息或异常):

(for {
    as <- getAs
    bs <- getBs // This doesn't happen
    cs <- getCs // Or any of the following ones
    ds <- getDs
} yield (as, bs, cs, ds)).map(tuple => println("done"))

我只是在寻找正确的方法来发出大量的http请求,而不必打开太多的文件描述符。

我有一个类似的问题,对一个Web服务的请求太多(约500个以上)。 您的带有分组的代码示例几乎是正确的,但是,您将获得Iterator[Future[List[Int]]]Future.sequence -d it Future[Iterator[List[Int]]] 但是,我认为它们将异步运行。 您需要先触发一批,然后对它进行flatMap (等待直到完成),然后触发下一批。 这是我设法写的,遵循以下答案

val futureIterator = list.grouped(50).foldLeft(Future.successful[List[Int]](Nil)) {
  (fItems, items) =>
    fItems flatMap { processed =>
      println("PROCESSED: " + processed); println("SPAWNED: " + items);
      Future.traverse(items)(getFuture) map (res => processed ::: res)
    }
}
println(Await.result(futureIterator, Duration.Inf))

希望这可以帮助!

您可以使用Octoparts:

https://m3dev.github.io/octoparts/

但是听起来确实像您想反转模式,以便wsClient在外部进行调用,然后再对Future [WSResponse]出来进行平面映射。 这将限制AsyncHttpClient使用的内部Netty线程池的期货数量,并且您可以更改配置设置以增加或减少Netty通道池中的线程数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM