3

最近我发现自己在类中包装了actors,这样我就可以找回一些在处理ActorRefs 时失去的类型安全性。最后,问题是,我不仅需要发送特定消息,还需要将响应转换为预期结果。所以我认为我可以向包含的参与者发送消息,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))
  }

  ...
}
4

3 回答 3

1

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

于 2017-12-19T09:33:08.393 回答
1

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

至少,无需为此付出额外努力。

于 2017-12-19T11:50:13.363 回答
1

询问模式肯定更好。

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

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

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

于 2017-12-19T14:30:54.330 回答