5

play 2.0 フレームワークでアプリケーションを作成しています。このアプリの目的は、画像のアップロードを処理し、バックグラウンドでサイズを変更することです。

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

ある程度の負荷の下でアプリをテストするまで、これはすべてうまく機能します。負荷がかかると、サイズ変更操作は利用可能なすべての CPU 時間を効果的に消費するため、着信 HTTP リクエストは CPU 時間がいくらか不足し、これらのリクエストのバックログが発生し、最終的にリクエストがタイムアウトし始めます。

問題は、サイズ変更リクエストよりも着信 HTTP リクエストに高い優先度を与えるようにシステムを構成 (または書き直し) するにはどうすればよいかということです。

4

1 に答える 1

3

Akka のディスパッチャを調査する必要があります。基本的に、各アクターが処理に使用するスレッド/ワーカー プールを抽象化します。グローバル ディスパッチャーを 1 つ定義することも、複数定義することもできます。

限られた数のスレッド (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 に答える