我正在尝试将我的ask
请求限制为使用consumerActor。
val throttler: ActorRef =
Source.actorRef(bufferSize = 1000, OverflowStrategy.dropNew)
.throttle(10, 1.second, 1, ThrottleMode.Shaping)
.to(Sink.foreach[Any](msg => consumerActor ! msg))
.run()
与
aLotOfItems.map(items =>
val itemsFuture = (throttler ? consumeItems(items)).mapTo[Future[String]]
itemsFuture flatMap {x => x}
}).toVector
这确实会将msgs发送给consumerActor但我似乎丢失了响应,因为我尝试了2个项目,但请求只是挂起。
我想我需要将tell
中的Sink.foreach
更改为可以处理回复的问题或其他内容
解决方案:使用下面的选定答案让它工作。我不得不添加
val answer = Source(...) (from the selected answer below)
sender ! answer
答案 0 :(得分:1)
问题是您期望来自throttler
的回复,但throttler
没有发送回复,因为它没有对原始发件人的引用而无法发送回复。
如果consumerActor
使用consumeItems(i)
回复每封Future[String]
邮件的发件人,那么实现您要尝试的内容的一种方法是创建Source
来自aLotOfItems
并使用mapAsync
和ask
的组合来限制发送给演员的消息。演员的回复可以在Sink
中累积。类似的东西:
val sink = Sink.seq[String]
val result =
Source(aLotOfItems)
.map(consumeItems(_))
.mapAsync(parallelism = 5)(item => (consumerActor ? item).mapTo[Future[String]])
.mapAsync(parallelism = 5)(identity)
.runWith(sink)
// Future[Seq[String]]