首页 > 解决方案 > 如何创建对远程节点具有不可序列化依赖关系的 Actor?

问题描述

假设您有一个 Actor ,MyActor它依赖于一个无法序列化的对象。示例包括:

对于Props这样的演员,Java 中的 可能看起来像这样:

public static Props props(ObjectMapper m, SomeService s) {
    return Props.create(new Creator<MyActor>() {
        @Override
        public MyActor create() throws Exception {
            return new MyActor(m, s);
        }
    });
}

依赖项被传递到 Actor 的构造函数中。问题是这在集群环境中不起作用:这些对象不可序列化,因此尝试在远程节点上创建参与者将失败。

我们如何在使用静态全局状态的情况下解决这个问题?

标签: akkaakka-cluster

解决方案


可以有不同类型的解决方案,这取决于您的需求。

例如,您可以将服务包装在 Cluster Singleton 中,然后通过集群将 actor ref 发送给它,然后您的 actor 道具将具有如下签名: public static Props props(ActorRef refToMapperWrapper, ActorRef refToServiceWrapper).

另一种解决方案是在您需要的节点上实例化新服务和对象映射器。然后,您应该在节点之间发送创建 Service/ObjectMapper 所需的对象(即构造函数参数),因此这些对象应该以某种方式进行序列化。

ObjectMapper 最好在每个节点上独立创建,但是它的配置可以跨节点发送。


推荐阅读