Akka Actors:询问模式与 Promise
Akka Actors: ask pattern vs Promise
最近我发现自己将 actor 包装在 类 中,这样我可以找回一些在处理 ActorRef
时丢失的类型安全性。
问题是,最后,我不仅需要发送特定消息,还需要将响应转换为预期结果。
所以我想我可以向包含 Promise
的演员发送消息,以便他们最终可以报告结果。
这是个坏主意吗?对我来说它看起来很整洁......类型安全并且工作得很好。为什么没有人提出这个想法?有什么我没注意到的问题吗?
询问基于模式的解决方案
case class GetUser(id:Long)
(actorRef ! GetUser(1l)).mapTo[User]
class UserRepoActor extends Actor{
def receive={
case GetUser(id)=>
sender() ! getUser(id)
}
...
}
基于承诺的解决方案
case class GetUser(id: Long, resp: Promise[User])
val req = GetUser(1l,Promise())
actorRef ! req
req.resp.future // No casting!!
class UserRepoActor extends Actor{
def receive={
case GetUser(id,resp)=>
response.success(getUser(id))
}
...
}
没有错。 akka typed 中使用了非常接近的方法,唯一的区别是:发送的是一次性 ActorRef[T]
而不是 Promise[T]
Promise
s 在分布式 actor 系统中不起作用。
至少,不需要额外的努力。
问模式肯定更好
1) Actor 应该不共享任何状态并通过消息与外部世界交互。兑现承诺其实是一个变异的共享变量
2) 将有状态对象传递给 actor 的创建者(例如 promise)会在重启时破坏 actor 的生命周期
所以基于承诺的方法适用于简单的情况。但是如果你就这样使用它,你可能根本不需要像 akka 这样复杂的东西?
最近我发现自己将 actor 包装在 类 中,这样我可以找回一些在处理 ActorRef
时丢失的类型安全性。
问题是,最后,我不仅需要发送特定消息,还需要将响应转换为预期结果。
所以我想我可以向包含 Promise
的演员发送消息,以便他们最终可以报告结果。
这是个坏主意吗?对我来说它看起来很整洁......类型安全并且工作得很好。为什么没有人提出这个想法?有什么我没注意到的问题吗?
询问基于模式的解决方案
case class GetUser(id:Long)
(actorRef ! GetUser(1l)).mapTo[User]
class UserRepoActor extends Actor{
def receive={
case GetUser(id)=>
sender() ! getUser(id)
}
...
}
基于承诺的解决方案
case class GetUser(id: Long, resp: Promise[User])
val req = GetUser(1l,Promise())
actorRef ! req
req.resp.future // No casting!!
class UserRepoActor extends Actor{
def receive={
case GetUser(id,resp)=>
response.success(getUser(id))
}
...
}
没有错。 akka typed 中使用了非常接近的方法,唯一的区别是:发送的是一次性 ActorRef[T]
而不是 Promise[T]
Promise
s 在分布式 actor 系统中不起作用。
至少,不需要额外的努力。
问模式肯定更好
1) Actor 应该不共享任何状态并通过消息与外部世界交互。兑现承诺其实是一个变异的共享变量
2) 将有状态对象传递给 actor 的创建者(例如 promise)会在重启时破坏 actor 的生命周期
所以基于承诺的方法适用于简单的情况。但是如果你就这样使用它,你可能根本不需要像 akka 这样复杂的东西?