我正在编写一个关于play 2.0框架的应用程序。此应用程序的目的是处理图像上传并在后台调整它们的大小。
上传是通过将文件保存到文件系统的标准邮件处理程序处理的。现在,这只是在事件或IO线程上完成的。成功保存文件后,会向AKKA演员发送一条消息,将原始图像的大小调整为多种不同的大小(目前为4)。这些调整大小的操作对CPU要求很高,需要一些时间。
这一切都运行良好,直到我在一些负载下测试应用程序。在负载下,调整大小操作实际上消耗了所有可用的CPU时间,因此传入的HTTP请求在某种程度上缺乏CPU时间,我们看到这些请求积压到最终请求开始超时的程度。
所以问题是,我如何配置系统(或重新编写它)以使传入的HTTP请求比调整大小请求具有更高的优先级?
答案 0 :(得分:3)
您应该调查dispatcher in Akka。基本上,它们抽象每个actor用于处理的线程/工作池。您可以定义一个全局调度程序或具有多个全局调度程序。
定义只有有限数量的线程(1或2)的调度程序:
resizing-thread-pool-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
core-pool-size-max = 1
}
}
并将其与调整大小的演员联系起来:
context.
actorOf(
Props[ResizingActor].withDispatcher("resizing-thread-pool-dispatcher"),
"resizingActor"
)
当然,我们的想法是您的resizing-thread-pool-dispatcher
使用较少的可用核心线程,因此您的HTTP线程仍然具有响应能力。