【问题标题】:How do you know what messages you can send to actor?你怎么知道你可以向演员发送什么消息?
【发布时间】:2014-08-08 06:53:56
【问题描述】:

是否有任何标准方法可以形式化我的 scala/akka actor api?恕我直言,我需要研究实施以知道要发送什么的情况并不是一个好的选择。此外,如果实现已更改并且我的消息不再有效(未调用我认为它调用的操作),我不会收到任何警告或错误。

【问题讨论】:

标签: scala akka actor


【解决方案1】:

这是一个在社区中讨论得非常多的问题。我听说 Akka 3 可能会更好地支持类型安全的演员,但那是一段时间。

与此同时,您可以使用TypedActors,但一般建议是在您的应用程序边界使用它们。

一个很好的方法是定义一个actor可以在他们的伴生对象中接收的消息,它不会给你任何类型安全,但是让actor的契约更加可见。这样,每次您想向参与者发送消息时,您都可以从其伴随对象定义的消息中选择。如果您对每个参与者都有特定的消息,这当然效果最好。如果您更改实现,您可以删除旧消息并添加新消息,这样每个想要使用旧实现的人都会遇到编译器错误。

最后在上周的邮件列表中有a nice pattern。他创建了特征来定义参与者及其消费者的合同,但您仍然需要注意消费者混合正确的特征。

根据我的经验,确保一切正常的最佳方法是一个广泛的测试套件,该套件将测试每个参与者自身,以及特定参与者之间的通信。

【讨论】:

    【解决方案2】:

    Erlang 中通常采用的方法是避免直接向进程发送消息,并在定义进程行为的同一模块中提供额外的 API。在 Akka 中它看起来像

    class Foo extends Actor {
      // handles messages Bar(x: Int) and Baz
    }
    
    object Foo {
      def bar(foo: ActorRef, x: Int) = foo ! Bar(x)
    
      def baz(foo: ActorRef) = (foo ? Baz).mapTo[TypeOfResponseToBaz]
    }
    

    一个问题是处理返回消息,因为 Erlang 通常比 Akka 提倡更多的同步风格。这可以通过命名约定来处理(例如,BarResponseFooBarResponse,如果不同的参与者处理具有不同响应的相同消息)。

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 2011-08-23
      • 1970-01-01
      • 2011-12-05
      • 2015-11-14
      • 2020-02-08
      相关资源
      最近更新 更多