Akka Kill vs. Stop vs. Poison Pill?

212

Pergunta sobre a Akka para iniciantes - Estou lendo o Akka Essentials, alguém poderia explicar a diferença entre Akka Stop / Poison Pill x Kill? O livro oferece apenas uma pequena explicação: "Matar é síncrono vs. Pílula de veneno é assíncrono". Mas de que maneira? O encadeamento do ator que está chamando é bloqueado durante esse período? Os atores infantis são notificados durante a matança, invocados após a parada, etc.? Exemplos de usos de um conceito versus outro?

Muito Obrigado!

LaloInDublin
fonte
12
rs_atl respondeu muito bem, deixe-me acrescentar que nada sobre os atores é síncrono, nem mesmo context.stop (self).
Roland Kuhn
1
@RolandKuhn what about context.become?
Ionuț G. Stan
3
context.becomedesigna o comportamento a ser aplicado à próxima mensagem, o que significa que entra em vigor após o processamento da mensagem atual; nesse sentido, é bem parecido context.stop(self).
Roland Kuhn

Respostas:

328

Ambos stope PoisonPillencerrará o ator e interromperá a fila de mensagens. Eles farão com que o ator pare de processar mensagens, envie uma chamada de parada para todos os seus filhos, espere que eles terminem e depois ligue para o postStopgancho. Todas as outras mensagens são enviadas para a caixa de correio de mensagens não entregues.

A diferença está em que as mensagens são processadas antes do início dessa sequência. No caso da stopchamada, a mensagem atualmente sendo processada é concluída primeiro, com todas as outras descartadas. Ao enviar um PoisonPill, essa é simplesmente outra mensagem na fila; portanto, a sequência será iniciada quando a mensagem PoisonPillfor recebida. Todas as mensagens que estão à frente na fila serão processadas primeiro.

Por outro lado, a Killmensagem faz com que o ator lance um ActorKilledExceptionque seja tratado usando o mecanismo normal do supervisor. Portanto, o comportamento aqui depende do que você definiu na sua estratégia de supervisor. O padrão é parar o ator. Mas a caixa de correio persiste; portanto, quando o ator reiniciar, ainda haverá as mensagens antigas, exceto a que causou a falha.

Consulte também a seção 'Parando um ator', 'Matando um ator' nos documentos:

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

E mais sobre estratégias de supervisão:

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

rs_atl
fonte
4
excelente resposta obrigado, deve ser publicado no tutorial da Akka!
LaloInDublin
16
A mensagem Kill não faz com que o ator seja reiniciado usando o mecanismo normal do supervisor, a menos que você use uma estratégia de supervisor não padrão porque o ActorKilledException resolve parar, não reiniciar.
22413 Lisa13:
Na verdade, é bastante irritante porque a única maneira integrada de reiniciar os atores é lançar uma exceção.
211313 Lisak
Ou envie um PoisonPill de um ator supervisor para aquele que deve ser reiniciado e inicie-o novamente.
22613 Lisa13:
Existe alguma diferença se estiver usando context.stop(self)?
BAR
1

Use PoisonPill sempre que puder. Ele é colocado na caixa de correio e é consumido como qualquer outra mensagem. Você também pode usar "context.stop (self)" de dentro de um ator.

JohnUK
fonte
0

O PoisonPill interrompe de forma assíncrona o ator após concluir todas as mensagens recebidas na caixa de correio, antes do PoisonPill.

idonnie
fonte
20
não, Kill não tem nenhuma prioridade especial, assim como PoisonPill
Roland Kuhn
0

Você pode usar a parada do ator e a pílula venenosa para interromper o processamento dos atores e matar para encerrar o ator por inteiro. x.stop é uma chamada que você faz no método akka receive, substituirá apenas o estado do ator pelo novo ator depois de chamar postStop. x! PoisonPill é um método que você transmite ao ator para interromper o processamento quando o ator está em execução (recomendado). também substituirá o estado do ator depois de chamar postStop. x.kill encerrará o ator e removerá o ator no caminho do ator e substituirá o ator inteiro por um novo ator.

JayaChandra S Reddy
fonte