从流中读取(播放框架/ Akka)时限制api调用

时间:2019-01-08 23:00:48

标签: scala playframework playframework-2.0 akka akka-stream

我的任务是从mongo db中读取一个集合(使用akka流),并为每个元素(文档)调用一些google api,并用google的结果丰富元素数据。

google限制api每秒调用50次,因此即时通讯使用油门,如下所示:

  def processSuppliers()(implicit m: Materializer): Future[Done] = {
    val suppliersSource: Source[Supplier, Future[State]] =
      suppliersCollection.find(json())
        .noCursorTimeout
        .cursor[Supplier]()
        .documentSource()
        .throttle(50, 1.second)

    suppliersSource
      .withAttributes(ActorAttributes.supervisionStrategy(decider))
      .runForeach(supplier => insertEnrichedSupplier(supplier))
  }

问题是:对于每个调用Google 0次或更多次的元素,有些元素会产生50至100次google调用,甚至更多。

所以我的油门极限实际上不是每秒50个...您对解决这个问题有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为这是可行的:

def processSuppliers()(implicit m: Materializer): Future[Done] = {
val suppliersSource: Source[Supplier, Future[State]] =
  suppliersCollection.find(json())
    .noCursorTimeout
    .cursor[Supplier]()
    .documentSource()
    .mapAsync(50)(supplier => insertEnrichedSupplier(supplier))
    .withAttributes(ActorAttributes.supervisionStrategy(decider))
    .run()
}