12

我们正在构建一个基于 Akka 集群的多组件系统。每个组件都是一个单独的 Play!项目并在启动时加入 Akka 集群,组件开始查找参与者工作。

问题

我对这个设置有两个问题:

  1. 编写测试代码非常困难(我们还没有弄清楚这一点),特别是在编写依赖于来自不同组件的多个参与者的测试时。我们如何解决依赖关系并在测试代码中创建适当的集群(在两个播放应用程序之间!)

  2. 在开发过程中,每个开发人员都必须启动多个 Sbt 实例来启动系统(不同的游戏项目),这会占用整个系统内存,开发变得异常缓慢。

我在寻找什么

我正在考虑使用集群“角色”属性进行选择性启动,这意味着只有一个 Play 项目,组件是(模块),并且在启动 Play 项目时我将扫描当前的“角色”此实例的属性并基于此我启动或停止某些组件/参与者。

这将使测试更容易,但我不知道如何在 Play 中执行此操作,特别是某些组件实际上提供 RESTful API(Play 控制器)并且我不知道如何在启动时启用/禁用路由和控制器玩。

是否有任何文件或内容显示构建模块化分布式系统的正确方法或任何线索?(也与如何设置 SBT 有关?

编辑 1:该项目位于单个存储库中,并且具有单个 sbt 构建(多个项目)

4

1 回答 1

7

这是一个很好的问题,虽然我不是 Play 专家,但我会分部分回答。

1 – 写作测试

我建议单独测试模块,以避免必要的测试用例呈指数级增长。为此,actors 是一个非常好的抽象,因为您可以通过注入 aTestProbe而不是真实的ActorRef. 在集群中,您通常希望在其他节点上查找服务,这意味着在测试中您构建您的探针并注入其路径 ( probe.ref.path) 而不是您在生产系统中查找的路径。

第二个方面涉及您希望多个服务参与的集成测试。在这种情况下,您不需要启动涉及多个 JVM 的“正确”集群,您只需在测试中启动多个 ActorSystem 并让它们在"localhost".

2 – 开发部署

不需要运行多个 sbt 实例,您可以创建一个合适的 Main 类,它在同一进程中启动所有必需的 ActorSystems,就像上面提到的测试一样。

3 – 节点角色管理

由 Play 管理的 ActorSystem 通常具有“前端”角色。除此之外,您还可以启动更多具有不同角色的系统,这些系统本身并不是 Play 应用程序。根据节点的角色触发不同的行为——启动不同的服务和启动不同的活动——是有意义的,我们自己在测试和实际应用程序中这样做。

关于为某些角色禁用某些路由的问题,我知道的不足以回答。

于 2013-11-17T14:19:12.293 回答