web-dev-qa-db-fra.com

Dois-je réutiliser le même Akka ActorSystem ou puis-je en créer un à chaque fois que j'en ai besoin?

Akka 2.x nécessite de nombreuses commandes pour référencer un ActorSystem. Donc, pour créer une instance d'un acteur MyActor vous pourriez dire:

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

En raison du besoin fréquent d'une ActorSystem: de nombreux exemples de code omettent la création à partir du code et supposent que le lecteur sait d'où vient une variable system.

Si votre code produit des acteurs à différents endroits, vous pouvez dupliquer ce code, en créant éventuellement des instances ActorSystem supplémentaires, ou vous pouvez essayer de partager la même instance ActorSystem en faisant référence à une instance globale ou en passant le paramètre ActorSystem autour.

La documentation Akka fournit un aperçu général des systèmes d'acteurs sous le titre 'Actor Systems', et il y a documentation de la classe ActorSystem . Mais aucun de ces éléments n'aide beaucoup à expliquer pourquoi un utilisateur d'Akka ne peut pas simplement compter sur Akka pour gérer cela sous le capot.

Des questions)

  • Quelles sont les implications du partage du même objet ActorSystem ou de la création d'un nouvel objet à chaque fois?

  • Quelles sont les meilleures pratiques ici? Passer un ActorSystem tout le temps semble étonnamment lourd.

  • Certains exemples donnent un nom à ActorSystem: ActorSystem("MySystem") d'autres appellent simplement ActorSystem(). Quelle différence cela fait-il et si vous utilisez deux fois le même nom?

  • akka-testkit Nécessite-t-il que vous partagiez un ActorSystem commun avec celui que vous transmettez au constructeur TestKit?

62
sroebuck

La création d'un ActorSystem est très coûteuse, vous devez donc éviter d'en créer un nouveau chaque fois que vous en avez besoin. Vos acteurs doivent également fonctionner dans le même ActorSystem, sauf s'il y a une bonne raison pour qu'ils ne le fassent pas. Le nom de l'ActorSystem fait également partie du chemin vers les acteurs qui y fonctionnent. Par exemple. si vous créez un acteur dans un système nommé MySystem, il aura un chemin comme akka://MySystem/user/$a. Si vous êtes dans un contexte d'acteur, vous avez toujours une référence à ActorSystem. Dans un acteur, vous pouvez appeler context.system. Je ne sais pas à quoi s'attend akka-testkit, mais vous pouvez jeter un œil aux tests akka.

Donc, pour résumer, vous devez toujours utiliser le même système, sauf s'il existe une bonne raison de ne pas le faire.

49
drexin

Voici quelques documents qui pourraient être utiles pour comprendre "Pourquoi le document suggère-t-il toujours d'utiliser un ActorSystem pour une application logique":

  1. La partie la plus lourde d'un ActorSystem est le répartiteur. Chaque ActorSystem en a au moins un. Le répartiteur est le moteur qui fait tourner les acteurs. Pour fonctionner, il a besoin de threads (généralement obtenus à partir d'un pool de threads). Le répartiteur par défaut utilise un pool de threads à jointure en fourche avec au moins 8 threads.

  2. Il existe des installations partagées, comme les acteurs gardiens, le flux d'événements, le planificateur, etc. Certains d'entre eux sont dans l'espace utilisateur, d'autres sont internes. Tous doivent être créés et démarrés.

  3. Un ActorSystem avec un pool de threads configuré pour le nombre de cœurs devrait donner les meilleurs résultats dans la plupart des cas.

  4. Ici, le document mentionne une application logique, je préfère considérer une application bloquante ou non bloquante. Selon la configuration du répartiteur, un ActorSystem correspond à une configuration. Si l'application concerne les mêmes logiques, un seul ActorSystem devrait suffire.

Voici un discussion , si vous avez le temps, vous pouvez le lire. Ils discutent beaucoup, ActorSystem, local ou distant, etc.

4
Haimei