web-dev-qa-db-fra.com

Comment sont les threads Java lourds par rapport aux acteurs Scala / Akka?)

Je comparais simplement les performances des acteurs scala vs vsJava threads.

J'ai été étonné de voir la différence, j'ai observé qu'avec mon système, je pouvais générer un maximum de ~ 2000 threads (en direct à la fois) mais avec le même système, j'ai pu générer ~ 500 000 acteurs de scala.

Les deux programmes ont utilisé environ 81 Mo de mémoire Heap de JVM.

Pouvez-vous expliquer comment les fils Java sont-ils beaucoup plus lourds que les acteurs scala/akka? Quel est le facteur clé qui a rendu le scala-acteur si léger?)

Si je veux atteindre la meilleure évolutivité, devrais-je opter pour un serveur Web basé sur un acteur au lieu de Java serveur Web/application traditionnel basé sur JBoss ou Tomcat?

Merci.

48
SmartSolution

Les acteurs Scala (y compris la variété Akka) utilisent des threads Java. Il n'y a pas de magie: plus de quelques milliers de threads s'exécutant simultanément sont un problème pour la plupart des machines de bureau.

Le modèle Acteur permet aux acteurs éveillés à la demande qui n'occupent un fil que s'ils ont du travail à faire. Certains problèmes peuvent être modélisés efficacement comme de nombreux agents endormis attendant de trouver du travail, qui le feront relativement rapidement et se rendront ensuite. Dans ce cas, les acteurs sont un moyen très efficace d'utiliser le thread Java pour faire votre travail, surtout si vous avez une bibliothèque comme Akka où les performances ont été hautement prioritaires.

Les Akka docs expliquent assez bien les bases.

Tous les serveurs Web raisonnablement évolutifs doivent résoudre ce type de problème d'une manière ou d'une autre; vous ne devriez probablement pas baser votre décision pour un serveur Web principalement sur la question de savoir si les acteurs sont utilisés sous le capot, et indépendamment de ce que vous utilisez, vous pouvez toujours ajouter des acteurs vous-même.

39
Rex Kerr

Un acteur Akka n'est pas équivalent à un fil. Cela ressemble plus à un Callable qui est exécuté sur un pool de threads.

Lorsqu'un message est envoyé à un acteur, cet acteur est placé dans un pool de threads pour traiter le message. Une fois terminé, le thread groupé peut être utilisé pour exécuter d'autres acteurs.

18
parsifal