あなたのマシンの能力とは何か他のものを実行していることを超えて、実際の最大値はありません。もしあなたが10mを走らせるための資源を持っていれば、あなたはそうすることができます。しかし、あなたが多くの俳優を動かそうとしているなら、私はあなたがおそらく重要なブロッキング問題を抱えているとか、あるいは俳優たちがプールでどのように働くかを理解できないと言うでしょう。
配備されたアクターは、古いスレッドプールエグゼキュータパターンのようなスレッドを保持しません。メッセージを処理するときにのみスレッドを使用し、メッセージが処理されたときにスレッドをディスパッチャに戻します。このようにして、ディスパッチャはスレッドを再利用します。したがって、プール内のアクター数の設定は、アクターから帯域幅を取得できるかどうかによって異なります。あまりにも少ない数のメッセージが受信トレイでバックアップを開始する場合は、あまりにも多くの場合は、他の何かのためにそれらのリソースを使用していた可能性があります。以前にmutlithreadedエグゼキュータでやっていたことを満足させるために必要なアクターの数がどれほど少ないかに驚くでしょう。
これらのアクターで長時間実行されているプロセスがある場合は、その長時間実行されているプロセスを処理する唯一の目的のために存在するアクターにプロセスをオフロードすることを検討する必要があります。たとえば、あなたの俳優たちは、大部分が完了するまでに数ミリ秒かかっている普通のデータベース操作を扱いますが、あなたが送るメッセージのいくつかは、分析データベースの検索を呼び出すので、10〜30秒かかることがあります。言葉を計算すると、これは永遠です。したがって、これらのプロセスでは、データベースアクタをPer-Taskアクタから外す方が良いでしょう。これは、特定のリクエストにサービスするためだけに存在し、レスポンスを返信した後で停止するアクタです。一般的なプロセスは次のとおりです。
context.actorOf(Props(classOf[PerTaskActor], sender(), message)
これは、このアクタの新しい子アクタを作成します。トップレベルのアクターとして作成する場合は、system.actorOf(...)を呼び出します。
class PerTaskActor(replyTo: ActorRef, msg: MyLongProcessMessage) {
// ....
}
はその後俳優の内側に、我々は、プロセスを実行したときに行わ:
replyTo.tell(result)
context.stop(self)
をこのようにして、あなたの長時間実行されるタスクがオフロードされ、コンストラクタは次のようになります。これらの俳優は、親の俳優が墜落した場合、それを使ってすべての子供を奪うので、壊れる可能性のある俳優の子どもたちをたくさんぶつけさせることはお勧めしません。これらのために特別な親アクター(ルーテッドアクターではなく)が必要な場合があります。