J'ai un nombre inconnu d'emplois à exécuter par un nombre connu (bien sûr) d'acteurs. Le numéro d'emploi initial pourrait augmenter après qu'un acteur achève un emploi. C'est-à-dire qu'un acteur, à la fin de sa tâche, pourrait ajouter un nouvel emploi à exécuter. P>
La façon dont je traite, c'est que chaque acteur envoie un message à la maîtrise lorsqu'il complète son travail, non seulement avec le résultat de l'exécution, mais également avec un «drapeau» indiquant que l'acteur est maintenant inactif. Le Master a une file d'attente et une file d'attente d'acteurs oisifs, chaque fois qu'un acteur envoie un «message terminé d'emploi», le maître vérifiera s'il y a autre chose pour cet acteur de faire ... ainsi de suite jusqu'à la file d'attente de l'emploi est vide et la file d'attente des inactifs est pleine ... à ce stade, je ferme le système. Il n'y a pas beaucoup de supervision ici, alors je sens que je ne le fais pas correctement ... P>
Je n'utilise pas de routeur car je ne pouvais pas trouver un moyen d'interroger le routeur pour des acteurs inactifs. Ma question est donc la suivante: p>
Quel est le moyen «approprié» de gérer la situation que j'ai décrite ci-dessus à Akka? P>
3 Réponses :
Vous devez jeter un coup d'œil sur capacités de routage d'AKKA. Autre autrefois, vous pouvez simplement créer des acteurs à la demande, c'est-à-dire pour chaque tâche, un nouvel acteur est créé de manière dynamique. Un acteur central maintient une trace de tous les acteurs actuellement actifs. Une fois qu'un acteur travailleur est terminé, il se renvoie un Ajout après la lecture du commentaire: strong>
Jetez un coup d'œil aux sources de SmallestMailBoxRouter Code> pourrait être ce que vous recherchez.
Poisonpill code> et informe le maître sur son arrêt (activement ou via le message Standard
Terminez CODE> message que AKKA enverra à l'acteur de supervision. ). Une fois qu'il n'y a plus d'acteurs actifs, c'est pas plus de tâches, l'acteur de contrôleur ferme le système. P>
milletsmailBoîte code>, un trait scala mélangé par
plus petitMailboxRouter code>. AVERTISSEMENT: Vous devriez avoir une connaissance de base de Scala. Mais c'est généralement une bonne idée de toute façon si vous souhaitez utiliser AKKA ... la méthode
isprocessingMessage (acatreuf) code> peut être comprise comme
isnotidit (acorref) code> p> p> p> < Pré> xxx pré> p>
J'ai traversé l'acheminement d'Akka et c'est pourquoi j'ai décidé de ne pas utiliser de routeur (peut-être que je devrais écrire le mien) parce que je ne peux pas interroger un routeur sur l'état de ralenti des travailleurs (peut-être que je me trompe, pourriez-vous identifier pour moi où regarder ?)
Je ne voulais pas appuyer sur Entrée ... Quoi qu'il en soit, je vais regarder dans la solution de pilule empoisonnée, c'est comme ce que je fais en ce moment, je ne tue pas un travailleur, je viens de le mettre à jour inactif afin que cela puisse être ré- Utilisé ... Quand je n'ai plus de tâches et que tous les travailleurs sont inactifs que je sais que je suis terminé.
Donc je vais écrire mon propre routeur :)
Une autre stratégie peut être d'utiliser un balancementDispatcher et un tourbardeur (en tant qu'acteur "pool"). De AKKA DOCS:
getContext().actorOf(new Props(MyActor.class).withRouter(new RoundRobinRouter(10)).withDispatcher("my-dispatcher"), "myActor");
L'équilibrage du répartiteur n'utilisera qu'une seule boîte aux lettres pour tous les acteurs créés qui sont tous créés avec BalancingDispatcher. Donc, cela fera votre emploi simple. P>