10

我对使用 Play 框架和 Akka 进行编程相当陌生,尽管我已经阅读了一段时间。我现在正在默认/基本 Play 环境中启动概念验证应用程序。我的问题源于 Play (http://www.playframework.org/documentation/2.0.1/ScalaWS) 中的 web 服务客户端 api。

此应用程序基本上需要以尽可能可扩展和高性能的方式调解对远程 SOAP Web 服务的调用。浏览器在 JSON 中进行 ajax 调用,Play 应用程序需要将它们转换为 SOAP/XML,反之亦然。

如果我直接通过控制器使用 play web 服务客户端,这些调用可以是异步的,这比我们现在做的(阻塞)要好得多。但是,我不清楚这在重负载下究竟会如何表现。并发/线程管理会很大程度上留给底层的 Netty 服务器吗?我有办法调吗?

另一种方法是使用控制器中的 Akka Actor 系统,在那里我可以控制路由策略、池大小、容错等。如果我采用这种方法,使用 Play 的异步 WS 客户端是否仍然有意义?如果是这样,这种方法(组成期货?)会是推荐的模式吗?

另一个似乎使 Akka 方法更具吸引力的因素是该应用程序最终将承担其他一些职责,因此我们可以控制/调整允许给该 ActorSystem 的资源并降低整个应用程序被 SOAP 服务拖累的风险。

4

1 回答 1

5

您正在详细说明的两个选项将起作用:

  • 使用 WS 的 play API 异步处理请求/响应
  • 使用 Akka 做同样的事情并在你的 actor 中同步管理你的 WS 调用

首先,没有正确或错误的解决方案。

表演!WS API 解决方案最容易实现和测试。社区中的许多人都依赖它(我确实如此)。

另一方面,即使 Akka 解决方案的设置接缝较重(不是那么多),它也会在未来为您带来更多的灵活性。您可以简单地使用异步播放!块并使用 Promise 进行异步计算。play promise 和 akka future 之间也有隐式转换。最后,要监控您的演员,您可以查看Typesafe 控制台

如果最重要的是性能,那么过早的优化通常会导致更多(和不必要的)复杂性。就我而言,我会从 API WS 开始,如果将来需要,我会转向 Akka 解决方案。

于 2012-06-27T10:05:44.980 回答