Kev*_*vin 6 playframework playframework-2.0
我是新手Play我理解,它可能是错的,play框架是非阻塞的,以异步方式处理请求,长阻塞操作应该使用promise异步完成.那么什么时候我应该使用promise或映射的promises来处理给定的请求,何时不使用?
例如,假设用户上传文件,当它到达控制器时,我将文件从临时文件夹移动到所需的文件夹并插入数据库记录.所以这涉及2个阻塞操作,文件移动和插入数据库.假设文件不大,比如最大10MB,那么文件移动应该是合理的快速.并且使用阻塞数据库驱动程序也应该快速插入db记录.
在这个简单的情况下,我是否应该使用一个promise/future来执行2个操作或2个映射的promises(移动文件然后插入db记录)或者根本不使用promise?为什么?
请分享您的想法/经验.先感谢您.
这实际上是一条很好的界限,决定什么会进入未来,什么不会最终取决于应用程序。
一般来说,您不必担心将来会进行数据库调用。由于底层驱动程序正在阻塞,因此即使您将其放在 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 同时执行这两个任务。