Akka,针对给定请求的聚合响应

时间:2016-09-30 11:50:38

标签: akka

我开始用Akka创建一个系统。该系统必须解决产品的依赖关系。依赖关系是从两个不同的来源计算的。

class Deps extends Actor {
  def receive = {
    case Resolve(p) => 
     context.actorOf(System1.props) ! Resolve(p)
     context.actorOf(System2.props) ! Resolve(p)
  }
}

但它必须聚合两个回复才能回复自己。没有Akka的任何经验,我正在考虑两个解决方案。

1 /维持Map[(Product, Sender), Set[Response]]

每次Deps演员从孩子那里收到Response时,都会将答案添加到集合中,如果有两个答案,则可以创建并发送答案。

2 /每Actor

创建一个Product

使用Deps作为构造函数参数初始化Product actor(或创建一个子actor)。它维护了两个var Option[Response],并且每次收到Response时,他都会验证是否存在,他可以创建并发送响应。

我认为这是最好的方法,但我必须为响应维护两个var,为发件人维护一个,所以我不确定这是最好的方法。

3 /使用ask

所有内容都在文档中描述。

4 /使用带有可变“结果”的告知

我的实际代码已经是Report,它是从所有来源的结果更新的。但我可以使用与Spray相同的模式;我可以将报告作为信息的一部分传递给所有参与者,这样他们就可以立即更新报告,这样我就可以“真实地忘记”。

在从演员回复发件人之前等待和聚合多个响应的常用方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用flatMap Future的{​​{1}}功能“聚合多个回复”,我认为这些功能最为理解为:

val fut1 : Future[Response] = 
  (context.actorOf(System1.props) ? Resolve(p)).mapTo[Response]

val fut2 : Future[Response] = 
  (context.actorOf(System2.props) ? Resolve(p)).mapTo[Response]

val comboFut : Future[(Response, Response)] = 
  for {
    resp1 <- fut1
    resp2 <- fut2
  } yield (resp1, resp2)

此Future可以与pipe pattern

一起使用
import akka.pattern.pipe

comboFut pipeTo sender