Akka演员:询问模式与承诺



最近,我发现自己在课堂上包装了演员,以便在与ActorRef s打交道时恢复了一些类型的影响。最终,问题是我不仅需要发送特定的消息,而且还需要对预期结果进行响应。因此,我认为我可以向包含Promise的演员发送消息,以便他们最终可以报告结果。

那是个坏主意吗?对我来说,它看起来很整洁... typesafe,效果同样出色。为什么没有人提出这个主意?我没有注意到有什么问题吗?

基于图案的解决方案

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中使用非常接近的方法,唯一的区别是:发送单使用ActorRef[T],而不是Promise[T]

Promise s在分布式演员系统中无法使用。

至少在没有其他努力的情况下。

询问模式绝对更好。

1)参与者不得共享状态,并通过消息与外部世界互动。实现诺言实际上是一个变异共享变量

2)将状态对象传递到Actor的创造者(例如Promise)中,在重新启动时打破了演员的生命周期

因此,基于承诺的方法在简单的情况下起作用。但是,如果您像这样使用它,那么您根本不需要像Akka这样的复杂物品?

最新更新