2013-01-21 90 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線程仍然響應。