与Akka和Futures的同时请求过多

时间:2018-12-03 09:56:46

标签: scala parallel-processing akka future

我的情况是这样的。

  1. 我有一个包含大量报告的向量,需要使用rest api调用来发送报告。
  2. 我正在使用Futures.traverse(1中提到的向量)
  3. 由于向量太大,因此失败,超过了最大打开请求数。

我可以想到的一个初始解决方案是增加max-open-requests设置。但是这里的问题是我不知道需要预先发送的报告数量。

有人可以建议其他解决方案,例如限制通过Futures.traverse发生的并行性

1 个答案:

答案 0 :(得分:3)

由于您用akka标记了此问题,所以我假设您使用akka-http进行呼叫。您可以使用akka-streams批量发出请求,从而避免连接溢出,例如:

Source(reportsVector)
  .grouped(safeValue)
  .mapAsync(1)(reps => Future.traverse(reps)(x => ...)) //do your stuff
  .mapConcat(identity)
  .runWith(Sink.seq)

该示例将一次执行safeValue并发调用,并将所有结果收集到一个集合中,当整个流完成时将返回该集合。您还可以与slidingsplitWhen等其他运算符一起使用,以使其更适合您的用例,还可以调整safeValuemapAsync并发值。请注意,该流的来源是一个已知矢量(reportsVector),但它也可能是未知的有限报告流。