Akka在Java中键入了演员

时间:2015-02-14 13:49:13

标签: java akka

我不明白为什么不在TypedActors中使用Akka。使用反射(well .. instanceof)来弥补Java中缺少模式匹配是非常难看的 据我所知,TypedActors应该像你的软件“Akka world”和“Non Akka world”之间的门。但是为什么我们不会抛弃所有的OO原则而只是使用反思! 你为什么不想使用演员并确切地知道它应该响应什么?或者为了保持演员模型的Akka,为什么不创建一个使用双调度的消息层次结构来激活actor中的正确方法(我知道你不应该将Actors作为参数传递并使用ActorRef代替)。登记/> 免责声明:我是Akka和这个模型的新手,我没有使用Akka编写一行代码,但只是阅读文档让我头疼。

3 个答案:

答案 0 :(得分:7)

在我们开始之前:问题是关于deprecated "typed actors" module。这将很快被akka-typed取代,这是一个更优秀的问题,这避免了下面解释的缺点 - 如果你对打字演员感兴趣,请看看akka-typed!


我将列举使用您引用的类型化actor实现的许多缺点。请注意,我们刚刚合并了一个新的akka-typed模块,它将类型安全带回了akka演员的世界。为了这篇文章,我不会深入探讨开发打字版本是如此艰难的挑战的原因,让我们现在回答问题"为什么不使用(旧)打字的演员& #34;

首先,它们从未被设计为工具包的核心。它们建立在Akka提供的消息传递基础架构之上。请注意,由于这种消息传递基础设施,我们能够实现位置透明度和Akka众所周知的性能。他们大量使用反射和JDK代理来转换消息发送方法和从消息发送方法转换。这非常昂贵(时间紧迫),与普通的Akka演员相比,性能降低了10倍左右,见下面的乒乓球"基准(使用两种风格实现,发送者告诉演员,演员回复 - 100.000次):

Unit = ops/ms
Benchmark                                                Mode   Samples         Mean   Mean error    Units
TellPingPongBenchmark.tell_100000_msgs                   thrpt       20 119973619.810 79577253.299   ops/ms
JdkProxyTypedActorTellPingPongBenchmark.tell_100000_msgs thrpt       20  16697718.988   406179.847   ops/ms

Unit = us/op
Benchmark                                                Mode   Samples         Mean   Mean error    Units
TellPingPongBenchmark.tell_100000_msgs                   sample  133647        1.223        0.916    us/op
JdkProxyTypedActorTellPingPongBenchmark.tell_100000_msgs sample  222869       12.416        0.045    us/op

(基准保留在akka/akka-bench-jmh中,并通过OpenJDK JMH插件使用sbt-jmh工具运行。)

其次,使用方法来抽象分布式系统并不是一个很好的方法(哦,我记得RMI ...让' s 再去那里)。使用这样的"看起来像一种方法"让你不再考虑消息丢失,重新排序以及在分布式系统中可以和的所有事情。它还使用def getThing(id: Int): Thing之类的签名鼓励(使#" 太容易做错事") - 这将生成阻止代码 - 性能太可怕了!您确实希望保持异步和响应,这就是为什么当您尝试与这些(基于代理的)类型的演员合作时,您最终会遇到大量未来。

最后,你基本上失去了一个主要的Actor功能。 Actor可以执行的3个规范操作是1)发送消息2)启动子actor 3)根据收到的消息改变它自己的行为(参见Carl Hewitt的原始论文Actor Model)。第三种功能用于精美地建模状态机。例如,您可以说(在简单的akka​​演员中)become(active)然后become(allowOnlyPrivileged),在receive实现之间切换 - 进行有限状态机实现(我们还有DSL for FSMs)与之合作愉快。您无法在JDK代理类型的actor中表达这一点,因为您无法更改公开方法的集合。一旦您使用状态机进行思考和建模,这是一个主要的缺点。

新希望(第1集):请查看Roland Kuhn撰写的the upcoming akka-typed module(预览很快将包含在2.4版本中),我是非常肯定你会喜欢你所发现的安全明智的东西。此外,该实现最终将比当前的无类型演员更快(省略了impl细节,因为答案已经很久了 - 短版本:基本上我们将通过新的实现删除大量的分配)。 / p>

我希望你会喜欢这个彻底的答案。欢迎在此处或akka-user - 我们的官方邮件列表中的评论中提出后续问题。快乐的哈金!<​​/ p>

答案 1 :(得分:0)

Typed Actors为您提供了一个在您的域名中定义的静态契约 - 您可以将其消息命名(将被委托给底层实现并异步执行)在您的域中有意义的操作,避免使用反射你的部分(TypedActors使用JDK Proxies,所以仍然有反射,你只需要担心它,你获得了传递给活动对象/类型的参数的类型检查演员及其返回类型。documention对此很清楚,但我知道对于那些基于演员的并发新手,其他例子总是有帮助的,所以如果你还有麻烦,可以随意提出其他问题/评论解决差异。

答案 2 :(得分:0)

但是你们是否意识到您拥有大量没有专门知识开发人员的公司,而是一个可以根据我们的需要水平扩展的大型Infra,所以性能并不总是最佳的选择”,而是响应式的,消息驱动的,弹性的和弹性的,这要归功于我们拥有的类型演员,被对Akka或Reactive一无所知的开发人员使用 编程。

不要误会我的意思,我每天都在使用纯Akka类型,但是对于交付团队,我们拥有使用类型化actor的框架,而我们的使用者则使用POJO而不知道他们是在反应式中编码系统。这就是很棒的功能。