2016-11-13 3 views
0

私はアクターを作成するためにakkaルータを使用しています。 nr-of-instancesを設定する最善の方法は何ですか?私の俳優の目的はdbにデータを挿入することです。そうすれば、できるだけ多くの並列アクターで動作させたいと思っています。それはちょうど任意の数字ですか?最大は何ですか?Akkaルータでnr-of-instancesを設定する最も良い方法は何ですか

これは、ルータが設定されている方法です。

akka { 
    actor{ 
    deployment { 
     /Master/router9 { 
      router = smallest-mailbox-pool 
      nr-of-instances = ??? 

     } 
    } 
    } 
} 

答えて

0

俳優がスレッドにどのように関係するか、この答えはあなたのより良いアイデアを与えるかもしれません:How are akka actors implemented on underlying threads?

より多くの俳優が作成されるとJVMのヒープが大きく成長しますしかし、ルートの数には厳しい最大値はないと私は考えています。インスタンス数の選択は、自分のテストに基づいて行う必要があります。利用可能なスレッドの数とスレッドがアイドル状態になっている頻度によって、決定が通知される場合があります。

0

あなたのマシンの能力とは何か他のものを実行していることを超えて、実際の最大値はありません。もしあなたが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) 

をこのようにして、あなたの長時間実行されるタスクがオフロードされ、コンストラクタは次のようになります。これらの俳優は、親の俳優が墜落した場合、それを使ってすべての子供を奪うので、壊れる可能性のある俳優の子どもたちをたくさんぶつけさせることはお勧めしません。これらのために特別な親アクター(ルーテッドアクターではなく)が必要な場合があります。

関連する問題