代码之家  ›  专栏  ›  技术社区  ›  Nagireddy Hanisha

与akka和futures同时请求过多

  •  4
  • Nagireddy Hanisha  · 技术社区  · 7 年前

    我的设想是这样的。

    1. 我有一个向量,由大量需要使用rest api调用发送的报告组成。
    2. 我正在使用futures.traverse(1中提到的向量)
    3. 由于向量太大,它将失败,超过最大打开请求数。

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

    有人能不能建议一个替代的解决方案,比如限制通过未来发生的并行性。

    1 回复  |  直到 7 年前
        1
  •  3
  •   RoberMP    7 年前

    既然你用 akka ,我假设您正在使用akka http进行调用。您可以使用akka流成批发出请求,以避免连接溢出,例如:

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

    示例将执行 safeValue 一次并发调用并将所有结果收集到一个集合中,该集合将在整个流完成时返回。您还可以与其他操作员一起玩,如 sliding splitWhen 为了使它更适合您的用例,您可以调整 安全指数 以及 mapAsync 并发值也是。注意,这个流的源是一个已知的向量( reportsVector )但它也可能是一个未知的有限的报告流。

    推荐文章