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’un ActorSystem : de nombreux exemples de code omettent la création du code et supposent que le lecteur sait d’où provient 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 d’ ActorSystem en vous référant à certains globaux ou en faisant ActorSystem .

La documentation d’Akka fournit un aperçu général des systèmes d’acteurs sous le titre «Systèmes d’acteurs», et il existe une documentation de la classe ActorSystem . Mais aucun de ces deux éléments ne permet d’expliquer pourquoi un utilisateur d’Akka ne peut pas simplement compter sur Akka pour gérer ce problème.

Des questions)

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

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

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

  • Est akka-testkit ce que akka-testkit exige que vous ActorSystem un ActorSystem commun avec celui que vous transmettez au constructeur TestKit ?

Créer un ActorSystem coûte très cher, vous devez donc éviter d’en créer un chaque fois que vous en avez besoin. De plus, vos acteurs doivent fonctionner dans le même ActorSystem, à moins qu’il y ait une bonne raison pour qu’ils ne le fassent pas. Le nom de l’ActorSystem fait également partie du chemin d’access aux acteurs qui le composent. 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 ressemble akka-testkit, mais vous pourriez jeter un oeil aux tests d’akka.

Donc, pour résumer, vous devez toujours utiliser le même système, à moins qu’il y ait une bonne raison de ne pas le faire.

Voici quelques documents utiles pour comprendre “Pourquoi le document suggère-t-il toujours d’utiliser un seul 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 fonctionner les acteurs. Pour faire fonctionner, il faut des threads (généralement obtenus à partir d’un pool de threads). Le répartiteur par défaut utilise un pool de threads de jointure avec au moins 8 threads.

  2. Il y a des fonctionnalités partagées, comme les acteurs du gardien, le stream d’événements, le planificateur, etc. Certains d’entre eux se trouvent 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 se configure en fonction du nombre de cœurs qui devrait donner les meilleurs résultats dans la plupart des cas.

  4. Ici, le document mentionne une application logique, je préfère envisager une application bloquante ou non bloquante. Selon la configuration du répartiteur, un seul ActorSystem est destiné à une configuration. Si l’application est pour les mêmes logiques, un ActorSystem devrait suffire.

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