【问题标题】:Typed messages in akka在akka中输入消息
【发布时间】:2012-07-02 07:49:54
【问题描述】:

Akka 框架建议仅将类型化的 Actor 用于与外部代码交互。但是,来自 akka 的标准演员是无类型的。有没有更好的方法来创建类型安全的演员?是否有其他一些演员框架或围绕 akka 的类型安全包装器?

【问题讨论】:

  • 你想解决什么问题?
  • @ViktorKlang 我想确保只向我的演员发送正确的消息。
  • 您可能想查看stackoverflow.com/a/5551034/734191,其中 Viktor 提供了更多解释(例如,become)。

标签: scala akka


【解决方案1】:

如果您真的想要具有静态类型的actors,那么您不妨继续在整个代码中使用类型化actors。出于几个原因,强烈建议不要这样做。

1.) 您冒着系统退化为一堆 RPC 的风险。演员的接收方法很明显整个事情都是关于消息传递的,如果你只是在一个类型化的演员上调用方法,那就更不用说了。

2.) 演员真的没有类型。在运行时,actor 能够处理的消息可能会根据所处的状态而变化,就像它对这些消息所做的那样。这是对大量协议进行建模的绝佳方式,Akka Actor 使用 FSM 对其提供一流的支持。

因此,如果您真的想这样做,您可以在任何地方随意使用类型化的 Actor,它会起作用,但您应该在这样做之前认真考虑您要解决的问题。

【讨论】:

    【解决方案2】:

    有关编译时检查,请参阅SynapseGrid 框架。它定义了一个构建 DataFlow 拓扑的 SystemBuilder。在构造时,保证检查通过的类型。然后将生成的系统转换为具有嵌套且正确互连的 Actor 的 RuntimeSystem。

    【讨论】:

      【解决方案3】:

      为什么这对您来说是个问题? akka.actor.Actor 具有类型为 PartialFunction 的接收方法,只会调用它可以处理的消息。为什么需要编译时检查?但要回答您的问题:一种方法是 - 对于外部 api - 围绕您的 ActorRef 构建一个包装器,然后将消息发送给参与者。

      【讨论】:

      • 是的,我想要进行编译时检查。
      • 我的问题不是你是否需要编译时检查,而是为什么?
      • 演员应该自己决定它是否可以处理某个消息。如果您想在之后添加更多消息,您将不得不进行大量代码更改,这也会使远程处理变得更加困难。
      • Actor 自己决定只是因为 akka 不支持类型安全。确保您将消息静态发送到正确类型的参与者而不捕获运行时错误“无法处理消息”,这将是非常好的。制作可以即时组合的可扩展协议 - 对 scala 来说是一项艰巨的任务。仍然可以实现:milessabin.com/blog/2011/06/09/scala-union-types-curry-howard
      【解决方案4】:

      事情进展得很快,我想更新一下 1.打字演员是deprecated 2. 相反,Akka Typed 的新概念正在开发中

      据我了解,这应该是类型化actor系统的最终解决方案。但由于这至少是 Akka 2.4 的第三次尝试和最早的计划,因此这一说法仍有待证实。

      我个人确实期待这两种系统都可用:现有的系统用于更动态的用例,新的系统用于更强大的用例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 2018-09-29
        • 2021-06-17
        • 1970-01-01
        • 2016-09-08
        • 2016-10-08
        • 2015-02-22
        相关资源
        最近更新 更多