我是Play的新手我理解,它可能是错误的,通过以异步方式处理请求,播放框架是非阻塞的,长时间阻塞操作应该使用promise异步完成。那么什么时候我应该使用promise或映射的promises来处理给定的请求,何时不使用?
例如,假设用户上传文件,当它到达控制器时,我将文件从临时文件夹移动到所需的文件夹并插入数据库记录。所以这涉及2个阻塞操作,文件移动和插入数据库。假设文件不大,比如最大10MB,那么文件移动应该是合理的快速。并且使用阻塞数据库驱动程序也应该快速插入db记录。
在这个简单的例子中,我是否应该使用一个promise / future来执行2个操作或2个映射的promises(移动文件然后插入db记录)或者根本不使用promise?为什么?
请分享您的想法/经验。 提前谢谢。
答案 0 :(得分:4)
这实际上是一个很好的界限,决定未来的发展方向以及最终不依赖于应用程序的内容。
通常,您不必担心将来会调用数据库调用。由于底层驱动程序是阻塞的,因此将阻塞某个地方,即使您将其放在未来或演员中。所以:尝试减少db延迟。确保您的数据库在附近(从拓扑网络上讲)并且有足够的资源。
以非阻塞方式移动文件可以通过以下方式轻松处理:
def uploadFile() = Action {
Async {
// handle file moving
Ok
}
}
但是,假设你仍然有两件昂贵的事情与文件有关。如果一个动作依赖于另一个动作,那么你可以根据自己的喜好组织它(在一个Future中完全没问题)。你必须在开始第二个任务之前完成第一个任务。但是,使用两个期货,代码可能是最干净的。高水平,如:
for { movedFile <- moveFile(file)
analyzedFile <- analyzeFile(movedFile) } yield analyzedFile
对我来说似乎很干净。但是,不要觉得你必须将每一个小动作分成它自己的未来。
但是,如果您有两个可以独立运行的任务,那么您当然可以使用两个期货同时执行这两个任务。