0

我还没有遇到很多将 Play 与 akka-cluster 后端和像 Cassandra 这样的 NoSql 存储相结合的例子,所以我在实施这样一个系统时有些不确定性。

为了具体起见,我没有抽象地描述设置,而是提出了一个示例,它代表了 play 和 akka 可以大放异彩的一整类问题:

考虑:一个数据库支持的(让我们使用 Cassandra 集群)公路旅行应用程序,当您旅行时,它会推荐兴趣点。用户有帐户、输入设置和一些偏好。有一个旅行仪表板视图,包括旅行历史等。计划是使用 Play 和 Angular 的 web 应用程序,大多数 web 应用程序是从数据库中提取用户数据和 POI 数据并模板化、更新视图的简单案例。然而,计算和排名该区域 POI 的算法使 akka-cluster 和 actor 模型成为一个引人注目的解决方案。它需要用户数据(每天更新)和 POI 数据(按位置更新)作为输入,然后根据该数据运行算法。

总结: - 一个播放前端,提供请求,并调用由数据库支持的服务来满足请求(获取用户数据、模板等) - 一个 akka 集群后端,它从前端(或客户端)获取请求以排名积分基于用户数据(即偏好、年龄、历史)对该区域感兴趣的区域。这也需要通过参与者访问数据库。

讨论的一部分可能必然包括对所选数据存储最优化的内容,但这里是高级解决方案:

  1. 将所有数据访问职责委托给 akka 集群,Play 仅将“获取一些数据”请求以及“基于数据 x、y 和 z 进行一些计算”请求转发到后端。这消除了多租户混淆

  2. 将所有基本请求保留在播放端用数据存储数据填充模板,并将集群仅用于 cpu 密集型计算。播放前端转发计算请求。这意味着两者都可以访问 cassandra 集群(可怕吗?)

  3. Play 应用程序只做计算,Akka-http 为客户端公开了计算 Api(角度,两个微服务都可以访问同一个 cassandra 集群

  4. 使用 Akka-http 和 Angular 消除游戏并使其成为休息服务

对不起,如果这是一个太高级的问题。有什么想法吗?

4

1 回答 1

1

正如您所说,这是一个高级别的问题,但我认为您走在正确的轨道上,即您正在考虑不同的选择。另一个有用的事情是考虑每个选项的权衡

更具体地说,我会建议以下内容。基本上为架构中的每一层(或环)分配职责。关键思想是您应该能够独立部署和扩展每一层。

  1. 将所有数据访问和计算分配给 Akka。这将允许您的 Akka 集群独立扩展。这也意味着您的用户界面层对您的数据存储一无所知。假设明天你从 Cassandra 迁移到 HBase,你的前端将受到最小的影响。

  2. 将所有与 HTTP 和用户界面相关的东西分配给 Play。确保您没有在 Play 中保留任何状态。将所有状态推送到 Akka 或您的数据库。这将允许您水平缩放播放层。

  3. 使用 Spray REST 服务为您的 Akka 集群提供数据端点。您可以在两者之间添加一个缓存层以加快访问速度。

我不建议取消 Play,因为它提供的不仅仅是 REST 端点。

最后,根据我的经验,这不是“正确”的架构。它真正归结为您的特定需求和要求。

于 2014-12-24T04:04:34.677 回答