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

anc*_*ath 10 performance akka playframework

我对使用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服务拖拽的风险.

khe*_*aud 5

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

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

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

表演!WS API解决方案最容易实现和测试.社区中的许多人都依赖它(我这样做).

另一方面,即使Akka解决方案接缝较重(不是那么多)设置,它也会为您带来更大的灵活性.你可以简单地使用异步播放!阻止并使用promise进行异步计算.游戏承诺和akka未来之间也存在隐含的转换.最后,要监视您的演员,您可以查看Typesafe控制台.

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

  • 实际上我想知道的第二种选择是一种双异步.Actors是否仍然可以使用WS API(或底层的非同步httpclient)? (2认同)