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