我开始用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相同的模式;我可以将报告作为信息的一部分传递给所有参与者,这样他们就可以立即更新报告,这样我就可以“真实地忘记”。
在从演员回复发件人之前等待和聚合多个响应的常用方法是什么?
答案 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