我试图理解为什么人们会在typed actors上使用无类型的演员。 我已经阅读了几篇关于此的帖子,其中一些帖子如下: What is the difference between Typed and UnTyped Actors in Akka? When to use what? http://letitcrash.com/post/19074284309/when-to-use-typedactors
我有兴趣了解为什么无类型演员在以下情况下更好:
我知道,由于成为/不成功的功能,无类型的演员在FSM的背景下更好。
我可以在负载均衡器中看到无类型的可能性,因为它不必知道消息的内容,而只是将它们转发给其他actor。但是,这也可以在类型反应器中实现。
有人可以在上面提到的区域提出一些用例,其中无类型的演员“更好”吗?
答案 0 :(得分:3)
类型actor有一个普遍的缺点:它们很难扩展。当您使用普通特征时,您可以轻松地将它们组合起来构建实现两个接口的对象
trait One {
def callOne(arg : String)
}
trait Two {
def callTwo(arg : Double)
}
trait Both extends One with Two
Both
特征支持两个特征组合的两个调用。
如果您使用actor方法来处理消息而不是直接调用,那么您仍然可以使用扩展接口来拒绝类型安全作为价格。
trait One {
val receiveOne : PartialFunction[String,Unit] = {
case msg : String => ()
}
}
trait Two {
val receiveTwo : PartialFunction[Double, Unit] = {
case msg : Double => ()
}
}
trait Both extends One with Two {
val receive : PartialFunction[Any, Unit] = receiveOne orElse receiveTwo
}
receive
特征中的Both
值组合了两个部分函数。第一个只接受String
s,第二个只接受Double
s。他们有一个共同的超类型:Any
。所以扩展版本应该使用Any
作为参数,并且变得有效无类型。该缺陷在scala类型系统中,它使用with
关键字支持类型乘法,但不支持联合类型。您无法定义Double or String
。
输入的演员失去了轻松扩展的能力。演员将类型检查转换为逆变位置并扩展它需要联合类型。您可以使用ceylon编程语言了解它们的工作原理。
不是那种无类型和类型的演员有不同的应用范围。所有质疑的功能都可以用两者来表达。选择更多的是方法论和便利性。
键入允许您在进行单元测试之前避免一些错误。它将花费辅助协议声明的样板。在上面的示例中,您应该明确声明联合类型:
trait Protocol
final case class First(message : String) extends Protocol
final case class Second(message : Double) extends Protocol
你失去了简单的回调组合:没有orElse
方法。只有手写
val receive : PartialFunction[Protocol, Unit] = {
case First(msg) => receiveOne(msg)
case Second(msg) => receiveTwo(msg)
}
如果您想添加一些特性Three
的新功能,那么您将忙于重写该样板代码。
Akka为演员提供了一些有用的预定义增强功能。他们通过mixin(例如receive pipeline)或委派(例如reliable proxy)添加新功能。代理模式几乎在akka应用程序中使用,它们即时更改协议,向其添加控制命令。对于有类型的演员来说,这是不可能的。因此,您将被迫编写自己的实现,而不是预定义的实用程序。被弃用的公用事业不会受到FSM的限制。
由您决定是否值得增加工作的打字改进。没有深入了解你的项目,没有人能给出精确的建议。
答案 1 :(得分:2)
类型演员非常新; they're explicitly marked as experimental and not ready for production use.
警告
该模块目前是实验研究的主题。这意味着API或语义可以在没有警告或弃用期间更改,并且不建议在生产中使用此模块 - 您已收到警告。
(截至撰写本文时)
答案 2 :(得分:0)
我想指出一个似乎已浮出水面的混乱。 Casper,你提到的“类型演员”已被弃用,最终甚至会删除,我已经详细解释了为什么会出现这种情况:Akka typed actors in Java。你在Viktor Klang回答中找到的链接,正在谈论Akka 1.2,这是现在的“古代”(当2.4是稳定版本时)。
说到这里,有一个名为“Akka Typed”的新实验模块,Daenyth在回复中提到了该模块。该模块可能确实成为一个新的核心抽象,但它还没有为黄金时间做好准备。
我建议你给出打字的模块:Akka Streams(Akka的最新成员,很快就会变成实验)和 Akka Typed了解演员如何在不久的将来(也许)打字。然后,实际上再次查看Actors并查看哪种模型最适合您的用例。 Untyped Actors的优势在于它是一个真正的,经过尝试的成熟模块/模型,所以你真的可以信任它们,如果你想要更多类型--Akka Streams在很多情况下都覆盖了你,但不是全部,所以你可以考虑实验模块(但请注意,我们很可能会在成熟时更改Typed API)。