节气门Akka Ask

时间:2017-08-29 18:42:09

标签: scala akka akka-stream

我正在尝试将我的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

1 个答案:

答案 0 :(得分:1)

问题是您期望来自throttler的回复,但throttler没有发送回复,因为它没有对原始发件人的引用而无法发送回复。

如果consumerActor使用consumeItems(i)回复每封Future[String]邮件的发件人,那么实现您要尝试的内容的一种方法是创建Source来自aLotOfItems并使用mapAsyncask的组合来限制发送给演员的消息。演员的回复可以在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]]