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

时间:2013-08-05 09:54:07

标签: playframework playframework-2.0

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

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

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

请分享您的想法/经验。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

这实际上是一个很好的界限,决定未来的发展方向以及最终不依赖于应用程序的内容。

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

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

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

但是,假设你仍然有两件昂贵的事情与文件有关。如果一个动作依赖于另一个动作,那么你可以根据自己的喜好组织它(在一个Future中完全没问题)。你必须在开始第二个任务之前完成第一个任务。但是,使用两个期货,代码可能是最干净的。高水平,如:

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

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

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