2013-01-21 94 views
5

我在play 2.0框架上编写应用程序。这个应用程序的目的是处理图片上传和调整他们在后台。在playframework中,我如何区分io线程优先于akka actor?

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

这一切都很好,直到我在某些负载下测试应用程序。在负载情况下,调整大小操作正在有效地占用所有可用的CPU时间,因此传入的HTTP请求在CPU时间上有点吃力,我们看到这些请求的积压达到最终请求开始超时的程度。

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

+1

有趣的话题,你有没有考虑使用外部图形库+建立图像队列来调整大小(即在数据库中)?在这种情况下,您可能会减慢队列执行速度,甚至在流量过大的情况下停止执行队列。 – biesior

+0

由于空间问题,我们尝试从db中的排队映像迁移。 – harmanjd

回答

3

您应该调查dispatcher in Akka。基本上他们抽象每个演员用于处理的线程/工作者池。您可以定义一个全局调度程序或具有多个调度程序。

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使用较少

只具有有限的线程数(1或2)定义调度线程可用的核心,所以你的HTTP线程仍然响应。