【问题标题】:Parallelization/threads inside a web request in Scala/Java?Scala/Java 中的 Web 请求中的并行化/线程?
【发布时间】:2011-09-09 15:45:36
【问题描述】:

我有一个 Web 服务,它正在执行许多数据库查询(对 MongoDB),然后对这些数据库查询返回的记录进行大量处理。每个 Web 请求需要运行大约 15-45 个这样的请求,这会导致页面响应时间不可接受,因为每个查询 + 处理大约需要 20 毫秒。缓存将不起作用,因为缓存未命中率会很高,并且数据需要尽可能新鲜。

我曾计划使用 Scala + Akka 和 actor 来并行化执行和处理查询的类,但我知道不鼓励在 servlet 容器内创建线程。在 Scala 中的 Web 请求中进行线程/并行化的推荐方法是什么?

【问题讨论】:

  • 我没有回答你的问题,因为如果你不能有多个线程,我不知道你是如何并行化任何东西的。我想说的是,使用 Akka Actor 可能不是一个好主意。 Akka Futures 将是去这里的方式。
  • @Derek 我想这是我的问题,可以在 Scala + Akka 的 Web 请求中的代码中使用 Actors 吗?我想拥有多个线程,将执行查询和处理的类包装在一个 Actor 中。我正在考虑 Futures,但也想知道我是否可以使用 Actors。
  • 我已经使用 Mist 成功编写了高度可靠和可扩展的应用程序 - Akka 中的 HTTP 插件,它在您的业务逻辑和 Web 容器之间放置了一个 Actor shim。所以我不明白为什么它有任何问题。

标签: web-services scala parallel-processing akka


【解决方案1】:

我不明白为什么您不能为此使用 Akka 的 Futures(我使用的是 2.0 SNAPSHOT)。

import akka.dispatch.Future
Future.sequence(1 to 45 map { i =>
  Future {
    ... make database query i ...
  }
}) onComplete { future =>
  future.result.map { resultList =>
    // resultList.foldLeft...
    // resultList.map...
    // resultList.foreach...
    // resultList.whatever...
  }
}

(而且在 Akka 中处理 Futures 的方法肯定不止一种以满足您的需求。该示例可能不适合您想要的)

查看优秀的 Akka 文档了解更多信息:Akka 1.2R6 Future documentation

正如我在上面的 cmets 中提到的,我过去曾使用 the Akka HTTP module 构建高度可扩展且可靠的应用程序,它们都是基于 Actor/Future 的。

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2022-01-06
    • 2010-11-04
    相关资源
    最近更新 更多