我想在集群上部署一个用akka制作的远程演员软件。该系统由几个工作节点和一个主节点组成。问题是我无法提前知道集群节点的 IP 地址(但我知道它们都是同一个子网的一部分)。因此,我需要一种在启动后发现每个人的 IP 地址的好方法,以便在每个节点上创建正确的 actor refs。
我正在寻找在任何自由软件许可下分发的轻量级解决方案(我只需要它进行初始设置)。
不久前,我创建了一个旨在解决您的问题的原型(请随意重用代码和/或贡献)。
关于它是如何工作的几句话。它为每个参与者注册表(=节点)启动一个远程参与者。RegistryActor 保存指向在分布式设置中运行的所有其他注册表的链接。当一个新节点添加到系统中时,它需要知道至少一个其他节点(ActorRegistry)并通知它。ActorRegistry 让所有其他节点都知道新的节点(因此,任何 RegistryActor 都具有指向所有其他 RegistryActor 的链接),并开始交换与 Actor 的链接的过程 - 最后,所有 Actor 注册表都具有指向所有 Actor 的链接(本地或远程)在系统中运行。
有关更多详细信息,请参阅此博文。
看看jgroups。
它符合您的所有标准——它是轻量级、开源且非常成熟、稳定的产品。
您可以根据您的要求轻松配置它以进行自动组管理和发现 - 它几乎支持任何网络配置 - 您可以使用多播、共享文件或单播进行组成员发现。
除非所有节点都共享一些常识,否则我认为您的解决方案将不得不依赖 IP 广播。广播被定义为向子网上的所有网络节点发送一个数据包,所以如果你的主节点这样做,而所有工作节点都在监听它,你应该能够在不知道先验 IP 地址的情况下连接它们。
我没有在 Scala 中对此进行编码,但这里有一个关于如何在 java 中广播消息的相当易读的示例:http: //download.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html。使用相同的类使其适应 Scala 应该很简单。