2013-01-21 15 views
5

私はplay 2.0フレームワークにアプリケーションを書いています。このアプリの目的は、画像のアップロードを処理し、それらをバックグラウンドでサイズ変更することです。playframeworkでは、アクターよりもスレッドの優先順位をどのように設定しますか?

アップロードはファイルをファイルシステムに保存する標準のポストハンドラを介して処理されます。今はちょうどイベントまたはIOスレッドで行われます。ファイルが正常に保存されると、AKKAのアクタには元の画像のサイズを変更するためのメッセージが送信されます(現在は4)。これらのサイズ変更操作はCPUを要求し、少し時間がかかります。

これはすべてうまくいく、私はいくつかの負荷の下でアプリケーションをテストするまで。負荷がかかっていると、リサイズ操作は有効なCPU時間をすべて消費するため、受信するHTTPリクエストはCPU時間が多少不足し、最終的に要求のタイムアウトが始まるまでこれらのリクエストのバックログが表示されます。

問題は、着信HTTPリクエストにサイズ変更要求よりも優先順位を与えるようにシステムを設定する(または書き直す)方法です。

+1

興味深い話題ですが、外部グラフィックライブラリを使用したり、サイズ変更する画像のキューを構築することを検討しましたか(DB内)?そのような場合は、キューの実行を遅くしたり、大量のトラフィックが発生した場合でも停止させることができます。 – biesior

+0

スペースの問題でdb内のイメージをキューに入れようとしています。 – harmanjd

答えて

3

dispatcher in Akkaを調査する必要があります。基本的には、各アクターが処理に使用するスレッド/ワーカー・プールを抽象化します。 1つのグローバルディスパッチャを定義することも、複数のディスパッチャを持つこともできます。アイデアはあなたのresizing-thread-pool-dispatcherが少ないを使用していることです。もちろん、

context. 
    actorOf(
    Props[ResizingActor].withDispatcher("resizing-thread-pool-dispatcher"), 
    "resizingActor" 
) 

resizing-thread-pool-dispatcher { 
    type = Dispatcher 
    executor = "thread-pool-executor" 
    thread-pool-executor { 
    core-pool-size-max = 1 
    } 
} 

とあなたのサイズ変更の俳優と関連付ける:

は、限られたスレッドの数(1または2)を有するディスパッチャを定義します使用可能なコアをスレッド化します。そのため、HTTPスレッドは依然として応答します。

関連する問題