【发布时间】:2014-08-08 06:53:56
【问题描述】:
是否有任何标准方法可以形式化我的 scala/akka actor api?恕我直言,我需要研究实施以知道要发送什么的情况并不是一个好的选择。此外,如果实现已更改并且我的消息不再有效(未调用我认为它调用的操作),我不会收到任何警告或错误。
【问题讨论】:
是否有任何标准方法可以形式化我的 scala/akka actor api?恕我直言,我需要研究实施以知道要发送什么的情况并不是一个好的选择。此外,如果实现已更改并且我的消息不再有效(未调用我认为它调用的操作),我不会收到任何警告或错误。
【问题讨论】:
这是一个在社区中讨论得非常多的问题。我听说 Akka 3 可能会更好地支持类型安全的演员,但那是一段时间。
与此同时,您可以使用TypedActors,但一般建议是在您的应用程序边界使用它们。
一个很好的方法是定义一个actor可以在他们的伴生对象中接收的消息,它不会给你任何类型安全,但是让actor的契约更加可见。这样,每次您想向参与者发送消息时,您都可以从其伴随对象定义的消息中选择。如果您对每个参与者都有特定的消息,这当然效果最好。如果您更改实现,您可以删除旧消息并添加新消息,这样每个想要使用旧实现的人都会遇到编译器错误。
最后在上周的邮件列表中有a nice pattern。他创建了特征来定义参与者及其消费者的合同,但您仍然需要注意消费者混合正确的特征。
根据我的经验,确保一切正常的最佳方法是一个广泛的测试套件,该套件将测试每个参与者自身,以及特定参与者之间的通信。
【讨论】:
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 提倡更多的同步风格。这可以通过命名约定来处理(例如,BarResponse 或 FooBarResponse,如果不同的参与者处理具有不同响应的相同消息)。
【讨论】: