【问题标题】:Akka Actors: ask pattern vs PromiseAkka Actors:询问模式与承诺
【发布时间】:2018-06-01 14:31:40
【问题描述】:

最近我发现自己在类中封装了演员,这样我就可以找回在处理ActorRefs 时失去的一点类型安全性。 最后,问题是,我不仅需要发送特定消息,还需要将响应转换为预期结果。 所以我想我可以向包含Promise的actor发送消息,以便他们最终报告结果。

这是个坏主意吗?它对我来说看起来很整洁......类型安全并且效果一样好。为什么没有人提出这个想法?有什么我没有注意到的问题吗?

询问基于模式的解决方案

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))
  }

  ...
}

【问题讨论】:

  • 向 Actor 发送包含 Promise 的消息是什么意思?在任何情况下,您都必须对传入消息进行模式匹配。你能发布一些代码示例吗?

标签: scala promise akka-actor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 为什么?有参考吗?
    • 基本上,文档。它们只是在设计时没有考虑到“分布式”。
    【解决方案3】:

    询问模式肯定更好。

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

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

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

    【讨论】:

    • 不完全正确。解决方案越复杂,它就越能利用类型安全。最后,基于 Promise 的解决方案只是为了增加类型安全性。我得到了另外两个提议的解决方案,如果我想使用分布式系统,基于 Promise 的解决方案将会失败,而 Akka 实际上正在努力以类似的方式添加一些类型安全。
    • 通过将有状态对象传递给参与者,您可以解决 akka API 的不便,但违反 akka 意识形态。从我的角度来看,这是一个更大的邪恶。不仅在我指出的分布式系统的情况下。
    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 2021-03-29
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多