我们正在构建一个基于Akka集群的多组件系统。每个组件都是单独播放!项目和开始它加入Akka集群和组件开始寻找演员工作。
这个设置有两个问题:
编写测试代码非常困难(我们还没有弄清楚),特别是在编写依赖于来自不同组件的多个actor的测试时。我们如何解决依赖关系并在测试代码中创建一个合适的集群(在两个播放应用程序之间!)
在开发过程中,每个开发人员都必须启动多个Sbt实例来启动系统(不同的播放项目),这会占用整个系统内存,开发变得非常缓慢。
我正在考虑使用集群“roles”属性来进行选择性启动,这意味着只有一个Play项目和组件(模块)和播放项目的启动我将扫描当前此实例的“roles”属性,并基于我启动或停止某些组件/ actor。
这将使测试变得更容易,但我不确切知道如何在Play中执行此操作,特别是某些组件实际上提供RESTful API(播放控制器)并且我不知道如何在启动时启用/禁用路由和控制器 - 游戏时间。
是否有任何文档或内容显示构建模块化分布式系统的正确方法或任何线索? (还有哪些与SBT的设置有关?
编辑1:项目位于单个存储库中,并且具有单个sbt构建(多个项目)
答案 0 :(得分:7)
这是一个很好的问题,虽然我不是Play专家,但我会部分回答。
我建议单独测试模块,以避免必要测试用例的指数爆炸。为此,演员是一个非常好的抽象,因为你可以通过注入TestProbe
而不是真正的ActorRef
来琐碎地模仿任何演员。在群集中,您通常希望在其他节点上查找服务,这意味着在测试中您构建探针并注入其路径(probe.ref.path
),而不是您在生产系统中查找的路径。 / p>
第二个方面涉及您希望多个服务参与的集成测试。在这种情况下,您不需要启动涉及多个JVM的“正确”集群,您可以在测试中启动多个ActorSystems并让它们在"localhost"
上进行通信。
没有必要运行多个sbt实例,你可以创建一个合适的Main类,它在同一个进程中启动所有必需的ActorSystems,就像上面提到的测试一样。
由Play管理的ActorSystem通常会有一个“前端”角色。除此之外,您还可以启动具有不同角色的更多系统,这些系统本身不是Play应用程序。触发不同的行为 - 启动不同的服务并启动不同的活动 - 根据节点的角色有意义,我们自己在测试和实际应用程序中这样做。
关于禁用某些角色的某些路线的问题,我不知道应该回答。