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-testkit
ActorSystem
コンストラクターに渡すものと共通のTestKit
を共有する必要がありますか?
ActorSystemの作成は非常にコストがかかるため、必要になるたびに新しいものを作成することは避けたいです。また、正当な理由がない限り、アクターは同じActorSystemで実行する必要があります。 ActorSystemの名前は、その中で実行されるアクターへのパスの一部でもあります。例えば。 MySystem
という名前のシステムでアクターを作成すると、akka://MySystem/user/$a
のようなパスになります。アクターコンテキストにいる場合は、常にActorSystemへの参照があります。アクターでは、context.system
を呼び出すことができます。 akka-testkitが何を期待しているのか分かりませんが、あなたはakkaテストを見てみることができます。
要約すると、正当な理由がない限り、常に同じシステムを使用する必要があります。
ここでは、「なぜ1つの論理アプリケーションに対して1つのActorSystemを使用するようにドキュメントが常に提案するのか」を理解するのに役立ついくつかの資料を示します。
ActorSystemの最も重い部分はディスパッチャです。各ActorSystemには少なくとも1つあります。ディスパッチャーは、アクターを実行させるエンジンです。実行するには、スレッドが必要です(通常はスレッドプールから取得されます)。デフォルトのディスパッチャは、少なくとも8つのスレッドを持つfork-joinスレッドプールを使用します。
ガーディアンアクター、イベントストリーム、スケジューラーなどの共有施設があります。それらの一部はユーザー空間にあり、一部は内部にあります。それらのすべてを作成して開始する必要があります。
コア数に合わせて構成された1つのスレッドプールを持つ1つのActorSystemは、ほとんどの場合に最良の結果を与えるはずです。
ここでのドキュメントは論理アプリケーションについて言及していますが、私はブロッキングまたはノンブロッキングアプリケーションを検討することを好みます。ディスパッチャーの構成によれば、1つのActorSystemは1つの構成用です。アプリケーションが同じロジック用である場合、1つのActorSystemで十分です。
これが discussion です。時間があれば、読むことができます。彼らはたくさんの、ActorSystem、ローカルまたはリモートなどについて議論します。