6

我是 Play 新手据我了解,这可能是错误的,Play 框架通过以异步方式处理请求是非阻塞的,长阻塞操作应该使用 Promise 异步完成。那么什么时候应该使用 promise 或映射的 promise 来处理给定的请求,什么时候不应该呢?

例如,假设用户上传了一个文件,当它到达控制器时,我将文件从临时文件夹移动到所需的文件夹并插入数据库记录。所以这涉及到 2 个阻塞操作,文件移动和插入数据库。假设文件不大,比如最大 10MB,那么文件移动应该相当快。使用阻塞数据库驱动程序插入数据库记录也应该很快。

在这个简单的情况下,我应该使用一个 promise/future 来执行 2 个操作还是 2 个映射的 promise(移动文件然后插入 db 记录)还是根本不使用 promise?为什么?

请分享您的想法/经验。先感谢您。

4

1 回答 1

4

这实际上是一条很好的路线,决定什么进入未来,什么最终不完全依赖于应用程序。

通常,您不必担心将来会调用数据库。由于底层驱动程序正在阻塞,因此您在某个地方阻塞,即使您将其放在未来或演员中。所以:尝试减少数据库延迟。确保您的数据库在附近(从网络拓扑上讲)并且有足够的资源。

以非阻塞方式移动文件可以通过以下方式轻松处理:

def uploadFile() = Action {
  Async {
    // handle file moving
    Ok
  }
}

但是,假设您对文件仍有两件昂贵的事情要做。如果一个动作依赖于另一个动作,那么您可以随心所欲地组织它(在一个 Future 中非常好)。您必须在开始第二个任务之前完成第一个任务。然而,代码可能是最干净的,使用两个期货。高级别的,比如:

for { movedFile <- moveFile(file)
  analyzedFile <- analyzeFile(movedFile) } yield analyzedFile

对我来说似乎很干净。但是不要觉得你必须把每一个微小的动作都分解成它自己的未来。

但是,如果您有两个可以独立运行的任务,那么您当然可以使用两个期货同时执行这两个任务。

于 2013-08-05T15:09:17.610 回答