5

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

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

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

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

4

1 回答 1

3

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

定义只有有限数量的线程(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 线程仍然是响应式的。

于 2013-01-21T20:15:18.687 回答