1

我有两个不同的 Java 8 项目,它们将存在于不同的服务器上,它们都将使用 Akka(特别是 Akka Remoting)相互通信。

例如,一个应用程序可能会向另一个应用程序发送Fizzbuzz消息:

public class Fizzbuzz {
    private int foo;
    private String bar;

    // Getters, setters & ctor omitted for brevity
}

我以前从未使用过 Akka Remoting。我假设我需要创建一个第三个项目,一个用于保存共享消息(例如Fizzbuzz和其他)的库/jar,然后将该库作为依赖项拉入两个项目。

就这么简单吗?是否有任何影响这些“共享”消息设计的序列化(或其他 Akka 和/或网络)注意事项?提前致谢!

4

1 回答 1

2

共享库是一种肯定的方法,除了确实存在序列化问题:

Akka 远程处理文档

当为actor使用远程处理时,您必须确保用于这些actor的道具和消息是可序列化的。不这样做将导致系统以意想不到的方式运行。

有关详细信息,请参阅序列化

基本上,您需要为发送的 actor 道具和消息(当然包括所有嵌套类)提供和配置序列化。如果我没记错的话,默认设置会让你在没有任何配置的情况下启动并运行,前提是你通过网络发送的所有内容都是 java 可序列化的。

但是,默认配置使用默认的 Java 序列化,这被认为是非常低效的 - 所以您可能想要切换到 protobuf、kryo 甚至 json。在这种情况下,将序列化实现和绑定提供为共享库是有意义的 - 无论是专用库还是您在问题中提到的“共享模型”的一部分 - 取决于您是否想在其他地方重用它并且介意/不介意到处都有与 serailization 相关的传递依赖。

最后,如果您允许一些个人意见,我建议首先尝试 protobuf - 它是二进制格式(阅读:高效)并且得到广泛支持(有其他语言的绑定)。Kryo 也很好用(我有一些在生产中使用 kryo 序列化的闭源 akka 集群应用程序),但在收集/地图处理方面有一些怪癖。

于 2018-10-27T06:03:19.907 回答