Java中的Akka类型的参与者

Java中的Akka类型的参与者,java,akka,Java,Akka,我不明白为什么不在Akka中使用TypedActors。使用反射(嗯..instanceof)来弥补Java中模式匹配的不足是相当难看的。 据我所知,TypedActors应该像一扇大门,位于软件的“Akka世界”和“非Akka世界”之间。但是为什么我们不抛弃所有OO原则,只使用反射呢 为什么你不想使用一个演员,并确切地知道它应该响应什么?或者为了保持actor模型,为什么不创建一个使用双重分派的消息层次结构,以便在actor中激活正确的方法(我知道您不应该将actor作为参数传递,而应该使用A

我不明白为什么不在
Akka
中使用
TypedActors
。使用反射(嗯..
instanceof
)来弥补Java中模式匹配的不足是相当难看的。
据我所知,
TypedActors
应该像一扇大门,位于软件的“Akka世界”和“非Akka世界”之间。但是为什么我们不抛弃所有OO原则,只使用反射呢
为什么你不想使用一个演员,并确切地知道它应该响应什么?或者为了保持actor模型,为什么不创建一个使用双重分派的消息层次结构,以便在actor中激活正确的方法(我知道您不应该将actor作为参数传递,而应该使用ActorRef)。

免责声明:我不熟悉
Akka
和这个模型,我还没有用
Akka
写过一行代码,但是仅仅阅读文档就让我头疼。

类型化的参与者为您提供了一个在您的域中定义的静态契约——您可以命名他们的消息(将委托给底层实现并异步执行)在您的域中有意义的操作,避免您使用反射(TypedActor在幕后使用JDK代理,因此仍然存在反射,您不必担心它,并且您可以根据传递给活动对象/类型化actor的参数及其返回类型进行类型检查。这一点非常清楚,但我知道对于那些不熟悉基于actor的并发的人来说,总是有额外的示例帮助,因此,如果您在探索差异方面仍有困难,请随时提出其他问题/意见。

在我们开始之前:问题是关于。该问题将很快被替换为,一个非常优秀的问题解决方案,它避免了下面解释的缺点-如果您需要,请查看akka键入的我们对打字演员感兴趣


我将列举使用您提到的类型化actors实现的一些缺点。但是请注意,我们刚刚合并了一个新模块,它将类型安全带回到akka actors的世界。为了这篇文章,我将不深入探讨开发类型化版本是一个如此艰巨的挑战的原因,让我们来看看现在回答“为什么不使用(旧)类型的演员”的问题

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

(基准测试通过插件保存并使用该工具运行。)

其次,使用方法来抽象分布式系统并不是一个好方法(哦,我怎么记得RMI…我们不要再去了)。使用这种“看起来像方法”使您不再考虑消息丢失、重新排序以及分布式系统中可能发生和确实发生的所有事情。它还鼓励(使“做错事太容易”)使用签名,如
def getThing(id:Int):Thing
-这将生成阻塞代码-这对性能非常糟糕!您确实希望保持异步和响应速度,这就是为什么在尝试与这些(基于代理的)类型的参与者正常工作时,您最终会遇到大量的未来

最后,你基本上失去了一个主要演员的能力。演员可以执行的3个规范操作是:1)发送消息2)启动子演员3)根据收到的消息改变自己的行为(见卡尔·休伊特的原始文章)。第三种功能用于对状态机进行漂亮的建模。例如,您可以说(在普通akka actors中)
变成(活动)
,然后
变成(allowOnlyPrivileged)
,在
接收
实现之间切换-使有限状态机实现(我们也有)成为一种工作乐趣。您无法在JDK代理类型的参与者中很好地表达这一点,因为您无法更改公开的方法集。一旦您开始使用状态机进行思考和建模,这是一个主要的缺点

新希望(第1集):请看一下罗兰·库恩(Roland Kuhn)的作品(即将在2.4版中发布的预览版),我相信你会喜欢那里的内容。而且,该实现最终将比当前的非类型参与者更快(这里省略impl细节,因为答案已经很长了-很短的版本:基本上,由于新的实现,我们将删除大量的分配)


我希望你会喜欢这个彻底的回答。欢迎在这里或我们的官方邮件列表中提出后续问题。哈金快乐

但你们真的知道,你们有大量的公司,他们没有专业的开发人员,但有大量的Infra可以按我们的需要横向扩展,所以性能并不总是最好的“追求”,而是反应灵敏、信息驱动、有弹性和弹性,这要感谢我们现有的类型化演员,被对Akka或Reactive一无所知的开发人员使用 编程

别误会我的意思,我每天都在使用纯Akka类型,但对于交付团队,我们有一个框架,使用类型化的参与者,而我们的消费者作为POJO使用,而不知道他们正在反应式系统中编码。这真是了不起的壮举
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