Akka Kill vs Stop vs Poison Pill?

212

Question pour débutant d'Akka - Je lis sur Akka Essentials, quelqu'un pourrait-il expliquer la différence entre Akka Stop / Poison Pill et Kill? Le livre offre juste une petite explication "Kill est synchrone vs Poison pill est asynchrone." Mais de quelle manière? Le thread de l'acteur appelant se verrouille-t-il pendant cette période? Les enfants acteurs sont-ils avertis lors de la mise à mort, de l'envie après l'arrêt, etc.? Exemples d'utilisations d'un concept par rapport à l'autre?

Merci beaucoup!

LaloInDublin
la source
12
rs_atl y a très bien répondu, permettez-moi d'ajouter que rien sur les acteurs n'est synchrone, pas même context.stop (self).
Roland Kuhn
1
@RolandKuhn qu'en est-il context.become?
Ionuț G. Stan
3
context.becomedésigne le comportement à appliquer au message suivant, ce qui signifie qu'il prend effet après le traitement du message en cours; à cet égard, il en est tout à fait ainsi context.stop(self).
Roland Kuhn

Réponses:

328

Les deux stopet PoisonPillmettront fin à l'acteur et arrêter la file d'attente de messages. Ils obligeront l'acteur à cesser de traiter les messages, à envoyer un appel d'arrêt à tous ses enfants, à attendre qu'ils se terminent, puis à appeler son postStopcrochet. Tous les autres messages sont envoyés à la boîte aux lettres des lettres mortes.

La différence réside dans le traitement des messages avant le début de cette séquence. Dans le cas de l' stopappel, le message en cours de traitement est terminé en premier, tous les autres étant rejetés. Lors de l'envoi d'un PoisonPill, il s'agit simplement d'un autre message dans la file d'attente, de sorte que la séquence démarre lorsque le PoisonPillest reçu. Tous les messages qui le précèdent dans la file d'attente seront traités en premier.

En revanche, le Killmessage amène l'acteur à lancer un ActorKilledExceptionqui est géré à l'aide du mécanisme de supervision normal. Le comportement ici dépend donc de ce que vous avez défini dans votre stratégie de superviseur. La valeur par défaut est d'arrêter l'acteur. Mais la boîte aux lettres persiste, donc lorsque l'acteur redémarre, il aura toujours les anciens messages à l'exception de celui qui a provoqué l'échec.

Voir également la section «Arrêter un acteur», «Tuer un acteur» dans la documentation:

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

Et plus sur les stratégies de supervision:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html

rs_atl
la source
4
excellente réponse merci, devrait être posté sur le tutoriel Akka!
LaloInDublin
16
Le message Kill ne provoque PAS le redémarrage de l'acteur à l'aide du mécanisme de superviseur normal, sauf si vous utilisez une stratégie de superviseur autre que celle par défaut, car ActorKilledException se résout à arrêter, pas à redémarrer.
lisak
En fait, c'est assez ennuyeux car la seule façon intégrée de redémarrer les acteurs est de lever une exception.
lisak
Ou envoyer un PoisonPill d'un acteur superviseur à celui qui doit être redémarré et recommencer.
lisak
Y a-t-il une différence en cas d'utilisation context.stop(self)?
BAR
1

Utilisez PoisonPill chaque fois que vous le pouvez. Il est placé sur la boîte aux lettres et est consommé comme tout autre message. Vous pouvez également utiliser "context.stop (self)" depuis un acteur.

JohnUK
la source
0

PoisonPill arrête de façon asynchrone l'acteur une fois qu'il a terminé tous les messages reçus dans la boîte aux lettres, avant PoisonPill.

idonnie
la source
20
non, Kill n'a pas de priorité spéciale, tout comme PoisonPill
Roland Kuhn
0

Vous pouvez utiliser à la fois l'arrêt d'acteur et la pilule empoisonnée pour arrêter le traitement des acteurs et tuer pour mettre fin à l'acteur dans son intégralité. x.stop est un appel que vous effectuez dans la méthode de réception akka, ne remplacera l'état d'acteur par un nouvel acteur qu'après avoir appelé postStop. X ! PoisonPill est une méthode que vous transmettez à l'acteur pour arrêter le traitement lorsque l'acteur est en cours d'exécution (recommandé). remplacera également l'état de l'acteur après avoir appelé postStop. x.kill mettra fin à l'acteur et supprimera l'acteur dans le chemin de l'acteur et remplacera l'acteur entier par un nouvel acteur.

JayaChandra S Reddy
la source