6

私のアプリケーションは、アクターのツリー構造を作成できる必要があります。これを行う標準的な方法は、インスタンス化コードをアクター内に配置して、子をインスタンス化できるようにすることです。私が望むアプローチは、特定のパスでアクターをインスタンス化できるようにすることです。mySystem でアクター A を作成し、直接 akka://mySystem/A/B および他のアクターを作成できるようにするなどです。そのような機能は存在しますか?それは私のコードを大幅に簡素化します。

編集: 携帯電話を使用していないので、詳しく説明させてください。

クラスがあると言う

class myActor extends actor

これらの n-way ツリーを作成する必要があります。次のようなものを使用して、受信関数で独自の子をインスタンス化するために必要なコードを用意する代わりに

case Create(n:Int) => {}

それを含めずに、コードの開始時に階層を手動で作成できるようにすることで、myActor コードを簡素化しようとしています。したがって、理想的には次のようなものです(仮想の静的関数「作成」を想定):

val sys = ActorSystem("mySystem")
Akka.Actors.Create("akka://mySystem/a", new myActor())
Akka.Actors.Create("akka://mySystem/a/b", new myActor())
Akka.Actors.Create("akka://mySystem/a/c", new myActor())

これにより、アクター ツリーが作成されます。

  a
 / \
b   c

さて、これはありますか?アクター コードをインスタンス化コードで乱雑にすることなく、これを行うためのより良い方法はありますか?

編集、ラウンド2:

わかりました、この機能は存在しないようです。代わりに、アクターのサブ特性を作成し、そこにすべてのインスタンス化コードを強制して、具体的な実装クラスが整然とした状態に保たれるようにしました。

4

3 に答える 3

4

あなたの質問は解決策の仮説から始まりますが、残念ながら問題の説明は含まれていません。

アクター ツリーは、主に監視階層として理解する必要があります。親は子の障害を処理し、親のライフサイクルは子のライフサイクルに境界を設定します。アクターが別のアクターの子であるべきかどうかは、これらの含意を考慮して決定する必要があります。

あなたの質問は、他の基準に従って監視ツリーをモデル化していることを暗示しているためsystem.actorFor、検索メカニズムとしてレジストリとして悪用する可能性が非常に高いからです。それが機能するまれなケースがあるかもしれませんが、先験的にはお勧めしません。ディスパッチャ アクター内にハッシュ マップを配置し、ルックアップを処理させたいと考えています。測定によって十分なパフォーマンスが得られないと結論付けた場合は、ルーターを使用してスケールアップできます。

あなたの質問に答えるには、各親は独自の子を作成する必要があります。つまり、何らかの方法でそれを行うためのコードが含まれている必要があります。階層を下に渡しPropsて、その一部を構成可能にすることはできますが、監督の意味を回避するべきではありません。リーフの 1 つが失敗した場合にどうなるかを自問してから、中間のアクターが再起動したときに推定リーフを再起動および/または強制終了する必要があるかどうかを自問してください。

于 2013-01-13T20:16:08.287 に答える
2

すべての俳優には親がいます。やりたいことを行うにはActor、他のすべてのアクター(ルートアクターを除く)の親として機能するクラスが必要です。親アクターは監督アクターと同義であるため、それらの親アクターに適用する監督戦略を指示する何らかの手段が必要になります。

アクター階層の内部位置に配置する一般的な親Actorを定義し、アクターパス名を分解して、それらのパスの1つ以上によって指定される階層を作成するメソッドを作成できると思います。おそらく、監視戦略を指定する方法と、最低限、receiveリーフアクターにインストールする関数が必要になります。

アクターのみが子を作成できるため、親アクターは、子アクター(他の親アクターまたはリーフアクター)を作成するためのメッセージに応答してActor、リーフアクターに対してインスタンス化するサブクラスを選択する方法を考え出す必要があります。

しかし、あなたの質問に答えるために、これを行うための組み込みのものは何もありません。Akka自体に追加することを正当化するのに十分な一般的なユーティリティはないと思います。

于 2013-01-12T02:34:03.747 に答える
2

ルート アクターを作成し、ルート アクター内から でツリーを作成しますactorFor。名前の階層を静的に構成するためにクラスパスで使用application.confするか、アドレスの一定の構造を作成します。もう 1 つのオプションは、パスを解析し、オーバーライドで子を作成することpreStartです。子のライフサイクルを監視するためのさまざまなスキームがあり、単一のアクターを介してメッセージを透過的に再起動およびルーティングします。

于 2013-01-12T04:24:50.640 に答える