akka - 如何创建对远程节点具有不可序列化依赖关系的 Actor?
问题描述
假设您有一个 Actor ,MyActor
它依赖于一个无法序列化的对象。示例包括:
- 一个 Jackson
ObjectMapper
,用于操纵 Json - 从 DI 容器中获得的某种服务
对于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 的构造函数中。问题是这在集群环境中不起作用:这些对象不可序列化,因此尝试在远程节点上创建参与者将失败。
我们如何在不使用静态全局状态的情况下解决这个问题?
解决方案
可以有不同类型的解决方案,这取决于您的需求。
例如,您可以将服务包装在 Cluster Singleton 中,然后通过集群将 actor ref 发送给它,然后您的 actor 道具将具有如下签名:
public static Props props(ActorRef refToMapperWrapper, ActorRef refToServiceWrapper)
.
另一种解决方案是在您需要的节点上实例化新服务和对象映射器。然后,您应该在节点之间发送创建 Service/ObjectMapper 所需的对象(即构造函数参数),因此这些对象应该以某种方式进行序列化。
ObjectMapper 最好在每个节点上独立创建,但是它的配置可以跨节点发送。
推荐阅读
- google-chrome - 用户名未显示在 Chrome“更新密码”中
- r - 在 R 中使用 API 密钥
- c# - Change location of pivot based on Input.GetTouch.position to zoom in
- python - 为什么系统只通过扫描第一个数字来决定哪个更大 - Python
- java - 这种情况下合适的设计模式是什么?(实例)
- python - 使用 Pandas 读取 CSV 文件会导致错误
- python - 无法根据公共索引将 Pandas 中的两个数据框相乘
- android - 如何让 Exoplayer2 在后台运行?(科特林)
- javascript - JavaScript 中的 tf.keras.preprocessing.sequence.pad_sequences
- django - 在 Wagtail bakerydemo 上传文件