Akka Actors:问问格局与承诺

时间:2017-12-19 07:45:24

标签: scala promise 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))
  }

  ...
}

3 个答案:

答案 0 :(得分:1)

Promise将不适用于分布式actor系统。

至少,没有额外的努力。

答案 1 :(得分:0)

没有错。 akka typed使用了非常接近的方法,唯一的区别是:发送一次性Map[String, String]而不是ActorRef[T]

答案 2 :(得分:0)

询问模式肯定更好。

1)演员应该不共享任何状态,并通过消息与外部世界互动。履行承诺实际上是一个变异的共享变量

2)将有状态对象传递给actor的创建者(例如promise)会在重启时打破actor的生命周期

所以基于承诺的方法在简单的情况下起作用。但是如果你像那样使用它可能你根本不需要像akka这样复杂的东西?