在Play框架中,何时使用Promises处理请求以及何时不处理?

Kev*_*vin 6 playframework playframework-2.0

我是新手Play我理解,它可能是错的,play框架是非阻塞的,以异步方式处理请求,长阻塞操作应该使用promise异步完成.那么什么时候我应该使用promise或映射的promises来处理给定的请求,何时不使用?

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

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

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

And*_*ner 4

这实际上是一条很好的界限,决定什么会进入未来,什么不会最终取决于应用程序。

一般来说,您不必担心将来会进行数据库调用。由于底层驱动程序正在阻塞,因此即使您将其放在 future 或 actor 中,您也会在某个地方阻塞。所以:尝试减少数据库延迟。确保您的数据库位于附近(从网络拓扑角度来说)并且具有足够的资源。

以非阻塞方式移动文件可以通过以下方法相当简单地处理:

def uploadFile() = Action {
  Async {
    // handle file moving
    Ok
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,假设您还有两件昂贵的事情需要处理该文件。如果一个动作依赖于另一个动作,那么您可以按照自己的意愿组织它(在一个 Future 中是完全可以的)。您必须先完成第一个任务,然后才能开始第二个任务。然而,使用两个 future 的代码可能是最干净的。高水平,比如:

for { movedFile <- moveFile(file)
  analyzedFile <- analyzeFile(movedFile) } yield analyzedFile
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很干净。但不要觉得你必须将每一个微小的行动分解为它自己的未来。

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