在远程Actor创建期间,Actor是否序列化?



假设我有2个远程节点,A和B,它们都通过TCP相互可见,并且都运行ActorSystems。

节点 A 的类路径中有一个包含 Actor Foo 的 jar。 节点 B 没有。

如果节点 A 上的 ActorSystem 告诉节点 B 在其 ActorSystem 中远程创建 Foo Actor ,这会起作用吗? Foo的字节码是通过网络发送到B,还是节点B需要在其类路径中包含Foo?

不,它不起作用。当节点 A 上的执行组件系统告诉节点 B 上的执行组件系统创建Foo执行组件时,节点 A 不会创建执行组件并将其通过网络发送。相反,节点 A 将FooProps(即创建Foo参与者的方法(发送到节点 B,并让节点 B 创建Foo的实例(FooProps必须是可序列化的(。此外,节点 B 的 actor 系统的类加载器必须有一个包含Foo类的 jar。从文档中:

远程创建角色

如果要在 Akka 远程处理中使用创建功能,则必须按以下方式进一步修改application.conf文件(仅显示部署部分(:

akka {
actor {
deployment {
/sampleActor {
remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553"
}
}
}
}

上面的配置指示 Akka 在创建具有路径/sampleActor的 actor 时做出反应,即使用system.actorOf(Props(...), "sampleActor")。不会直接实例化此特定 actor,而是要求远程系统的远程守护程序创建 actor,在此示例中对应于sampleActorSystem@127.0.0.1:2553

配置上述属性后,您将在代码中执行以下操作:

val actor = system.actorOf(Props[SampleActor], "sampleActor")
actor ! "Pretty slick"

actor 类 SampleActor 必须可供使用它的运行时使用,即 actor 系统的类加载器必须有一个包含该类的 JAR。

在同一部分的更下方:

请注意,远程

部署不是远程代码加载,要部署到远程系统上的 Actor 类需要存在于该远程系统上。

最新更新