1

我正在寻找在云中构建一个基于 Akka 的应用程序,用于我正在引导的车库初创公司;根据应用程序的性质,它是半状态的,尽可能多地缓存在 RAM 中以提高性能。(它可以容忍定期关闭和重新启动,但我们希望主要通过 Actors 内的缓存信息进行操作。)

该架构是为服务器集群设计的,必要时在它们之间进行通信,以便节点 A 上的用户会话可以在适当时查询节点 B 上的中间件 Actor。所以我的问题是,这在 CloudBees 中有多难?

我从这个页面的理解是,还没有自动目录服务来管理这种集群内通信,但我可能可以忍受——更糟糕的是,我应该能够通过数据库管理发现,每个节点在它出现时注册自己并打开与其他节点的多对多通信。

不过,我想检查的是,这种沟通是直截了当的。每个节点是否有一个可靠的本地 IP,它可以通过广告让其他人联系它,这至少在应用程序运行期间是稳定的?或者节点是否有另一种/更好的方式将其地址通告给运行此应用程序的其他节点?

(我假设一个应用程序的节点都共享同一个数据库实例。)

此处的任何指导将不胜感激。我想尽快选择一个托管服务提供商,并继续返回 CloudBees 作为最有前途的选项......

4

1 回答 1

4

目前对实例之间的通信没有限制 - 诀窍在于发现成员资格。很快就会发布一个 API,可以让您跟踪成员资格 - 但目前,以下可能有效:

  • 要获取端口,请查看 $PWD/.genapp/ports 中的文件名(因为应用程序可以有多个端口) - (例如 System.getenv("PWD") + ".genapp/ports" - 列出其中的文件目录 - 通常只有 1 - 文件名是端口)。还有其他方法——例如 JVM 应用程序上的“sun.java.command”系统属性。
  • 主机名可以通过通常的方式获得(例如 InetAddress.getLocalHost().getHostName()):这个主机名将是私有名称 - 即它将解析为私有 IP - 有利于节点到节点的通信。
  • 公共 IP/主机名:执行 HTTP 获取(从服务器)到以下 URL:( http://instance-data/latest/meta-data/public-hostname当然只会返回服务器端的公共 IP)。

(见http://developer-blog.cloudbees.com/2012/11/finding-port-or-address-of-your.html

然后,正如您所说,您可以在启动时向数据库注册适当的端口/私有主机名,然后在每个节点上读取它以“播种”集群(akka 不必了解所有成员 - 只需足够的种子)我认为一个 2 阶段启动:1:注册主机/端口,2,寻找其他成员,将它们作为种子成员添加到本地 Akka 配置中(可能需要定期做一段时间,因为其他节点启动 -以确保其播种足够)

从我在这里阅读 Akka 设置:http: //doc.akka.io/docs/akka/snapshot/scala/remoting.html

看起来您可以指定端口 - 所以如果可能的话,我会将其设置为 app_port 环境变量 - 这意味着每个节点都可以通过私有主机名与该端口进行通信。但是,http 流量也将被路由到它——akka 也可以处理这个问题——或者它是否需要一个用于 akka 的离散端口和另一个用于任何 http 接口的端口?

于 2012-11-06T03:18:05.490 回答