【问题标题】:Using Akka to make Web service calls from Play app使用 Akka 从 Play 应用程序调用 Web 服务
【发布时间】:2013-05-20 13:51:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: performance playframework akka


    【解决方案1】:

    您详细说明的两个选项都可以:

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

    首先,没有对错之分。

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

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

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

    【讨论】:

    • 实际上我想知道的第二个选项是一种双异步。 Actors 还能使用 WS API(或底层的 ning async httpclient)吗?
    • 您通过 WS 请求获得了一个承诺。演员仍然可以使用它。
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多