我对使用 Play 框架和 Akka 编程还很陌生,尽管我已经阅读了一段时间。我现在正在默认/基本 Play 环境中启动概念验证应用程序。我的问题源于 Play 中的 Web 服务客户端 api (http://www.playframework.org/documentation/2.0.1/ScalaWS)。
该应用程序基本上需要以尽可能可扩展和高性能的方式来调解对远程 SOAP Web 服务的调用。浏览器以 JSON 进行 ajax 调用,Play 应用程序需要将它们转换为 SOAP/XML,反之亦然。
如果我直接通过 Controller 使用 play web 服务客户端,这些调用可以是异步的,这比我们现在所做的(阻塞)要好得多。但是,我不清楚这在重负载下究竟会如何表现。并发/线程管理会主要留给底层 Netty 服务器吗?我有办法调整它吗?
另一种方法是使用 Controller 中的 Akka Actor 系统,我可以在其中控制路由策略、池大小、容错等。如果我采用这种方法,使用 Play 的异步 WS 客户端是否仍然有意义?如果是这样,这种方法(组成 future ?)是推荐的模式吗?
另一个似乎使 Akka 方法更具吸引力的因素是,该应用程序最终将承担其他几个职责,因此我们可以控制/调整此 ActorSystem 允许的资源,并降低整个应用程序被 SOAP 服务拖累的风险。
最佳答案
您详细说明的两个选项将起作用:
首先,没有正确或错误的解决方案。
表演! WS API 解决方案最容易实现和测试。社区中的许多人都依赖它(我这样做)。
另一方面,即使 Akka 解决方案在设置上接缝更重(不是那么多),它也会在 future 为您带来更大的灵活性。您可以简单地使用 Async play! blocks并使用 promise 进行异步计算。还有implicit conversions between play promises and akka future .最后,要监控您的 Actor ,您可以查看 Typesafe console .
如果重要的是性能,过早的优化通常会导致更多(和不必要的)复杂性。就我而言,我将从 API WS 开始,如果将来需要,将转向 Akka 解决方案。
关于performance - 使用 Akka 从 Play 应用程序进行 Web 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11221119/