最近,我发现自己在课堂上包装了演员,以便在与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这样的复杂物品?