web-dev-qa-db-ja.com

同じAkka ActorSystemを再利用する必要がありますか、それとも必要なときに毎回作成できますか?

Akka 2.xでは、ActorSystemを参照するために多くのコマンドが必要です。したがって、アクターMyActorのインスタンスを作成するには、次のようにします。

val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])

ActorSystemが頻繁に必要になるため、多くのコード例ではコードからの作成を省略し、読者がsystem変数の出所を知っていると想定しています。

コードが異なる場所でアクターを生成する場合、このコードを複製して、追加のActorSystemインスタンスを作成するか、グローバルを参照するか、ActorSystemを渡すことにより、同じActorSystemインスタンスを共有することができます。

Akkaのドキュメントでは、「アクターシステム」の見出しの下に アクターのシステムの一般的な概要 が提供されており、 ActorSystemクラスのドキュメント があります。しかし、これらのどちらも、Akkaのユーザーがこの内部で管理するためにAkkaに頼ることができない理由を説明するのに大いに役立ちません。

質問

  • 同じActorSystemオブジェクトを共有したり、毎回新しいオブジェクトを作成したりするとどうなりますか?

  • ここでのベストプラクティスは何ですか? ActorSystemを常に渡すことは、意外と重労働のようです。

  • いくつかの例はActorSystemに名前を付けます:ActorSystem("MySystem")他はActorSystem()を呼び出すだけです。これにより、どのような違いが生じますか。同じ名前を2回使用するとどうなりますか。

  • しますakka-testkitActorSystemコンストラクターに渡すものと共通のTestKitを共有する必要がありますか?

62
sroebuck

ActorSystemの作成は非常にコストがかかるため、必要になるたびに新しいものを作成することは避けたいです。また、正当な理由がない限り、アクターは同じActorSystemで実行する必要があります。 ActorSystemの名前は、その中で実行されるアクターへのパスの一部でもあります。例えば。 MySystemという名前のシステムでアクターを作成すると、akka://MySystem/user/$aのようなパスになります。アクターコンテキストにいる場合は、常にActorSystemへの参照があります。アクターでは、context.systemを呼び出すことができます。 akka-testkitが何を期待しているのか分かりませんが、あなたはakkaテストを見てみることができます。

要約すると、正当な理由がない限り、常に同じシステムを使用する必要があります。

49
drexin

ここでは、「なぜ1つの論理アプリケーションに対して1つのActorSystemを使用するようにドキュメントが常に提案するのか」を理解するのに役立ついくつかの資料を示します。

  1. ActorSystemの最も重い部分はディスパッチャです。各ActorSystemには少なくとも1つあります。ディスパッチャーは、アクターを実行させるエンジンです。実行するには、スレッドが必要です(通常はスレッドプールから取得されます)。デフォルトのディスパッチャは、少なくとも8つのスレッドを持つfork-joinスレッドプールを使用します。

  2. ガーディアンアクター、イベントストリーム、スケジューラーなどの共有施設があります。それらの一部はユーザー空間にあり、一部は内部にあります。それらのすべてを作成して開始する必要があります。

  3. コア数に合わせて構成された1つのスレッドプールを持つ1つのActorSystemは、ほとんどの場合に最良の結果を与えるはずです。

  4. ここでのドキュメントは論理アプリケーションについて言及していますが、私はブロッキングまたはノンブロッキングアプリケーションを検討することを好みます。ディスパッチャーの構成によれば、1つのActorSystemは1つの構成用です。アプリケーションが同じロジック用である場合、1つのActorSystemで十分です。

これが discussion です。時間があれば、読むことができます。彼らはたくさんの、ActorSystem、ローカルまたはリモートなどについて議論します。

4
Haimei