Play 2.5(Scala)

时间:2017-07-18 09:19:37

标签: java scala file-upload playframework playframework-2.0

我们已将一个组件从play(scala)2.4.6升级到2.5.8。升级后,当我们在生产中部署构建时,我们观察到上传文件时响应时间显着增加(API允许客户端上传图像)。为了挖掘更多,我创建了几个客户端,可以高速上传图像(每分钟2K上传),并发现:

  1. 如果客户端从AWS发送上传图像请求,则图像上传API的响应时间较短。
  2. 如果客户端从本地网络发送上传图像请求,则图像上传API的响应时间很长。
  3. 为了确认此行为,我们在生产时再次部署构建,开始使用客户端发送图像上传请求。通过服务器端日志,我们可以看到我们的客户端(部署在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。

0 个答案:

没有答案