¿Akka Kill vs. Stop vs. Poison Pill?

212

Pregunta de novato sobre Akka: estoy leyendo sobre Akka Essentials, ¿alguien podría explicar la diferencia entre Akka Stop / Poison Pill vs. Kill? El libro ofrece solo una pequeña explicación: "La muerte es sincrónica frente a la píldora venenosa es asincrónica". ¿Pero de qué manera? ¿El hilo del actor llamante se bloquea durante este tiempo? ¿Se les notifica a los niños actores durante la muerte, después de la detención envuelto, etc. Ejemplos de usos de un concepto versus el otro?

¡Muchas gracias!

LaloInDublin
fuente
12
rs_atl respondió muy bien, permítanme agregar que nada sobre los actores es sincrónico, ni siquiera context.stop (self).
Roland Kuhn
1
@RolandKuhn ¿qué pasa context.become?
Ionuț G. Stan
3
context.becomedesigna el comportamiento que se aplicará al siguiente mensaje, lo que significa que surte efecto después de que se haya procesado el mensaje actual; a este respecto es bastante parecido context.stop(self).
Roland Kuhn el

Respuestas:

328

Ambos stopy PoisonPillfinalizarán al actor y detendrán la cola de mensajes. Harán que el actor deje de procesar mensajes, envíe una llamada de detención a todos sus hijos, espere a que terminen y luego llame a su postStopenlace. Todos los mensajes adicionales se envían al buzón de letras muertas.

La diferencia está en qué mensajes se procesan antes de que comience esta secuencia. En el caso de la stopllamada, el mensaje que se está procesando actualmente se completa primero, con todos los demás descartados. Al enviar un PoisonPill, este es simplemente otro mensaje en la cola, por lo que la secuencia comenzará cuando PoisonPillse reciba. Todos los mensajes que están por delante en la cola se procesarán primero.

Por el contrario, el Killmensaje hace que el actor arroje uno ActorKilledExceptionque se maneja utilizando el mecanismo de supervisión normal. Entonces, el comportamiento aquí depende de lo que haya definido en su estrategia de supervisor. El valor predeterminado es detener al actor. Pero el buzón persiste, por lo que cuando el actor se reinicie, seguirá teniendo los mensajes antiguos, excepto el que causó la falla.

Consulte también la sección 'Detener a un actor', 'Matar a un actor' en los documentos:

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

Y más sobre estrategias de supervisión:

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

rs_atl
fuente
44
excelente respuesta gracias, debe publicarse en el tutorial de Akka!
LaloInDublin
16
El mensaje de muerte NO hace que el actor se reinicie utilizando un mecanismo de supervisor normal a menos que use una estrategia de supervisor no predeterminada porque ActorKilledException resuelve detener, no reiniciar.
lisak
En realidad, es bastante molesto porque la única forma integrada de reiniciar actores es lanzar una Excepción.
lisak
O enviando una PoisonPill de un actor supervisor al que debería reiniciarse y comenzar de nuevo.
lisak
¿Hay alguna diferencia si se usa context.stop(self)?
BAR
1

Usa PoisonPill siempre que puedas. Se coloca en el buzón y se consume como cualquier otro mensaje. También puede usar "context.stop (self)" desde un actor.

JohnUK
fuente
0

PoisonPill detiene asincrónicamente al actor después de que se haya completado con todos los mensajes que se recibieron en el buzón, antes de PoisonPill.

idonnie
fuente
20
no, Kill no tiene ninguna prioridad especial, al igual que PoisonPill
Roland Kuhn
0

Puede usar tanto la píldora de detención como la de veneno para detener el procesamiento de los actores, y matar para terminar con el actor en su totalidad. x.stop es una llamada que realiza en el método de recepción akka, solo reemplazará el estado del actor con el nuevo actor después de llamar a postStop. X ! PoisonPill es un método que pasa al actor para detener el procesamiento cuando el actor se está ejecutando (recomendado). también reemplazará el estado del actor después de llamar a postStop. x.kill terminará el actor y lo eliminará en la ruta del actor y reemplazará a todo el actor con un nuevo actor.

JayaChandra S Reddy
fuente