使用Akka从Play应用程序进行Web服务调用

时间:2012-06-27 07:12:24

标签: performance playframework akka

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

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

如果我直接通过控制器使用播放Web服务客户端,这些调用可以是异步的,这比我们现在做的更好(阻塞)。但是,我不清楚这在重载下会如何表现。并发/线程管理是否会主要留给底层的Netty服务器?我有什么方法可以调整它吗?

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

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

1 个答案:

答案 0 :(得分:5)

您要详细说明的两个选项可以使用:

  • 使用WS的播放API来异步处理请求/响应
  • 使用Akka做同样的事情并在你的演员中同步管理你的WS调用

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

游戏! WS API解决方案最容易实现和测试。社区中的许多人都依赖它(我愿意)。

另一方面,即使Akka解决方案接缝较重(不是那么多)设置,它也会为您带来更大的灵活性。您可以简单地使用Async play! blocks并使用promises进行异步计算。还有implicit conversions between play promises and akka future。最后,要监控您的演员,您可以查看Typesafe console

如果重要的是表演,过早优化往往会导致更多(和不必要的)复杂性。就我而言,我将从API WS开始,如果将来需要转移到Akka解决方案。