Je travaille avec akka depuis 7 à 8 mois maintenant tous les jours. Quand j'ai commencé, je travaillais sur des applications et je remarquais que les acteurs seraient utilisés pratiquement n'importe où une fois dans le système d'acteurs pour communiquer entre la plupart des objets. J'ai donc fait de même - faire tourner un autre acteur pour x/y/z.
Il me semble que cela peut être trop aveugle, ajoutant de la complexité là où cela n'est pas nécessaire - mais je ne trouve aucune discussion sur l'utilisation des acteurs par rapport à la logique simple synchrone ou même asynchrone via les futurs. J'ai commencé à réfléchir à ma position après que mon collègue ait mentionné quelque chose de similaire. Plus récemment, j'ai réalisé plusieurs cas où j'ai réfléchi à une tâche, puis j'ai évité de créer un autre acteur car je pouvais obtenir le même résultat en toute sécurité dans une implémentation immuable - par exemple, quelque chose comme obtenir des valeurs de configuration à partir d'une base de données ou d'un fichier quelque part où vous accédez très rarement et attendre que le résultat soit le cas d'utilisation réel.
En particulier, il me semble que dans tous les cas où vous jouez avec un état immuable, les acteurs créent de la complexité et limitent le débit - une fonction pure dans un objet, par exemple, peut être appelée simultanément sans risque avec n'importe quel niveau de concurrence, mais un acteur ne peut traiter qu'un seul message à la fois. L'autre considération est de garer le fil si vous devez attendre le résultat, sauf si vous commencez à utiliser des futures, mais dans les cas où vous n'avez pas à vous soucier de la messagerie asynchrone ou de la mise à l'échelle, il semble qu'il soit exagéré d'employer un acteur.
Donc ma question est - est-ce qu'il y a un mauvais moment pour utiliser des acteurs? Je suis curieux de voir à quoi ressemble Erlang et j'aimerais vraiment avoir les informations des autres. Ou s'il existe des principes concernant l'utilisation des acteurs.
C'est une question qui m'intéresse et sur laquelle j'ai fait des recherches. Pour d'autres points de vue, voir ceci article de blog de Noel Walsh ou cette question sur Stack Overflow. J'ai quelques opinions que je voudrais offrir:
Comme Jason, je suis impatient d'entendre les idées des autres ici. Comment puis-je résoudre certains des problèmes ci-dessus et mieux utiliser Akka?
Il convient de considérer à quoi sert le modèle d'acteur: le modèle d'acteur est
Cela est précieux car l'utilisation de l'état partagé à partir de plusieurs threads devient très difficile, surtout lorsqu'il existe des relations entre différents composants de l'état partagé qui doivent être synchronisés. Cependant, si vous avez des composants de domaine dans lesquels:
alors le modèle d'acteur n'apportera pas beaucoup (le cas échéant) d'avantages.
J'espère que cela pourra aider.
Votre intuition est correcte, à mon humble avis. Utiliser des acteurs partout, c'est comme avoir le marteau proverbial et ne voir que des clous.
La meilleure pratique d'Erlang consiste à utiliser des processus/acteurs pour toutes les activités qui se déroulent simultanément. Autrement dit, comme dans la vraie vie. Parfois, il est difficile de trouver la bonne granularité, mais la plupart du temps, vous le savez simplement en regardant le domaine modélisé et en utilisant un peu de bon sens. J'ai bien peur de ne pas avoir de meilleure méthode que cela, mais j'espère que ça aide.
Dans l'ordre de messagerie d'entrée/sortie:
J'ai récemment rencontré une application basée sur akka où le modèle d'acteur a effectivement causé des problèmes de concurrence, un modèle plus simple aurait suffi mieux sous charge.
Le problème était que les messages entrants se déplaçaient dans différentes "voies" (à travers différents chemins d'acteurs) mais le code supposait que les messages arriveraient à leur destination finale dans le même ordre qu'ils sont arrivés. Tant que les données arrivaient avec des intervalles suffisamment grands, cela fonctionnait car il n'y aurait qu'un seul message conflictuel se précipitant vers la destination. Lorsque les intervalles ont diminué, ils ont commencé à arriver hors service et à provoquer un comportement étrange.
Le problème aurait pu être résolu correctement avec un peu moins d'acteurs, mais c'est une erreur facile à faire en les surutilisant.