我们已将一个组件从play(scala)2.4.6升级到2.5.8。升级后,当我们在生产中部署构建时,我们观察到上传文件时响应时间显着增加(API允许客户端上传图像)。为了挖掘更多,我创建了几个客户端,可以高速上传图像(每分钟2K上传),并发现:
为了确认此行为,我们在生产时再次部署构建,开始使用客户端发送图像上传请求。通过服务器端日志,我们可以看到我们的客户端(部署在AWS上)发送的图像上传请求与来自真实客户端(即使用本地网络)的其他请求相比消耗的时间更少。
API代码:
def uploadImage(custId: String, devId: String) = Action.async(parse.multipartFormData) { implicit request =>
val startT = System.currentTimeMillis()
authenticateRole(Device, Admin) { implicit session =>
authenticateVendor {
authenticateDevice(custId, devId) {
val timestamp = System.currentTimeMillis()
Future {
val imageFile = new File(s"$pathToImageDirectory/$devId/$timestamp.jpg")
if (!imageFile.getParentFile.exists())
imageFile.getParentFile.mkdirs()
if (request.body.files != null && !request.body.files.isEmpty) {
val image = request.body.files.head.ref.file
org.apache.commons.io.FileUtils.copyFile(image, imageFile, false)
val totalT = System.currentTimeMillis() - startT
Logger.info(s"image-upload for [${request.uri}] took [$totalT] milli-seconds")
Ok(<response><status>success</status></response>)
} else {
BadRequest()
}
} recover {
case ex: IOException =>
InternalServerError()
}
}
}
}
}
使用日志已经清楚,控制器方法花费的时间非常少,在过滤器日志消息中我们可以看到高响应时间。我怀疑用于解析请求主体的方式可能会发生变化,因为在调用控制器方法之前请求主体解析已完成。
我还验证了线程池中有足够的线程用于Future的执行(使用Future的其他API具有较少的响应时间)。
有没有人观察过类似的行为?任何形式的帮助/建议,我们将不胜感激。
注意:
1.我们使用新文件代理(3.40.0)来监控响应时间
2.使用Scala 2.11.8
3.我们登录过滤器,告诉我们在处理每个请求时消耗的时间。这次与新文物展示相符
我们在控制器方法中添加了更多消息,告诉控制器方法消耗的时间。与过滤器或新文件报告中记录的时间相比,此时间显着减少
5.上传请求中的图像大小小于100 KB。