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]

Promises 在分布式 actor 系统中不起作用。

至少,不需要额外的努力。

问模式肯定更好

1) Actor 应该不共享任何状态并通过消息与外部世界交互。兑现承诺其实是一个变异的共享变量

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

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