我的任务是从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个...您对解决这个问题有什么建议吗?
答案 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()
}