我有两个不同的Java 8项目,它们将存在于不同的服务器上,并且都将使用Akka(特别是Akka Remoting(相互通信。
例如,一个应用可能会向另一个应用发送Fizzbuzz
消息:
public class Fizzbuzz {
private int foo;
private String bar;
// Getters, setters & ctor omitted for brevity
}
我以前从未使用过 Akka 远程处理。我假设我需要创建一个第三个项目,一个用于保存共享消息(例如Fizzbuzz
和其他消息(的库/jar,然后将该库作为依赖项拉入两个项目。
有这么简单吗?是否有任何序列化(或其他 Akka 和/或网络(注意事项会影响这些"共享"消息的设计?提前感谢!
共享库肯定是一种方法,除了确实存在序列化问题:
Akka-remoting docs:
对Actor使用远程处理时,必须确保用于这些Actor的道具和消息是可序列化的。如果不这样做,将导致系统以意外的方式运行。
有关详细信息,请参阅序列化。
基本上,您需要为发送的 actor 道具和消息(当然包括所有嵌套类(提供和配置序列化。如果我没记错的话,默认设置将使您无需进行任何配置即可启动并运行,前提是您通过网络发送的所有内容都是可 java 序列化的。
但是,默认配置使用默认的Java序列化,众所周知,这是非常低效的 - 因此您可能希望切换到protobuf,kryo甚至json。在这种情况下,将序列化实现和绑定作为共享库提供是有意义的 - 无论是专用库还是您在问题中提到的"共享模型"的一部分 - 取决于您是否想在其他地方重用它并且介意/不介意与 serailization 相关的传递依赖项到处弹出。
最后,如果您允许一些个人意见,我建议您先尝试protobuf - 它是二进制格式(阅读:高效(并且得到广泛支持(有其他语言的绑定(。Kryo 也运行良好(我有一些闭源 akka-cluster 应用程序,在生产中带有 kryo 序列化(,但在收集/地图处理方面有一些怪癖。