在playframework中,我如何优先考虑ik线程对akka actor?

har*_*njd 5 akka playframework-2.0

我正在编写一个关于play 2.0框架的应用程序.此应用程序的目的是处理图像上传并在后台调整它们的大小.

上传是通过将文件保存到文件系统的标准后处理程序处理的.现在,这只是在事件或IO线程上完成的.成功保存文件后,会向AKKA演员发送一条消息,将原始图像的大小调整为多种不同的大小(目前为4).这些调整大小的操作对CPU要求很高,需要一些时间.

这一切都运行良好,直到我在一些负载下测试应用程序.在负载下,调整大小操作实际上消耗了所有可用的CPU时间,因此传入的HTTP请求在某种程度上缺乏CPU时间,我们看到这些请求积压到最终请求开始超时的程度.

所以问题是,如何配置系统(或重新编写它)以使传入的HTTP请求比调整大小请求具有更高的优先级?

Tom*_*icz 3

您应该调查Akka 中的调度程序。基本上,它们抽象了每个参与者用于处理的线程/工作池。您可以定义一个或多个全局调度程序。

定义只有有限数量的线程(1 或 2)的调度程序:

resizing-thread-pool-dispatcher {
  type = Dispatcher
  executor = "thread-pool-executor"
  thread-pool-executor {
    core-pool-size-max = 1
  }
}
Run Code Online (Sandbox Code Playgroud)

并将其与您的调整大小演员相关联:

context.
  actorOf(
    Props[ResizingActor].withDispatcher("resizing-thread-pool-dispatcher"), 
    "resizingActor"
  )
Run Code Online (Sandbox Code Playgroud)

当然,这个想法是您resizing-thread-pool-dispatcher使用的线程少于可用核心,因此您的 HTTP 线程仍然具有响应能力。