【问题标题】:Building Modular Akka Systems构建模块化 Akka 系统
【发布时间】:2013-11-24 12:55:18
【问题描述】:

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

问题

这个设置有两个问题:

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

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

我在寻找什么

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

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

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

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

【问题讨论】:

    标签: scala playframework playframework-2.0 akka akka-cluster


    【解决方案1】:

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

    1 – 编写测试

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

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

    2 – 开发部署

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

    3 – 节点角色管理

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

    关于为某些角色禁用某些路由的问题我不太了解。

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2014-02-24
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多