Akka Kill vs. Stop protiv Poison Pill?


212

Питання для новачків Акки - я читаю над Akka Essentials, чи могла б хто-небудь пояснити різницю між Akka Stop / Poison Pill vs. Kill? Книга пропонує лише невелике пояснення: "Убити синхронно проти таблетки отрути асинхронно". Але яким чином? Чи замикається нитка, що викликає актор, протягом цього часу? Чи повідомляються діти-дійові особи під час вбивства, викликаються після зупинки тощо? Приклад використання одного поняття проти іншого?

Велике дякую!


12
rs_atl відповів на це дуже добре, дозвольте лише додати, що нічого про акторів не є синхронним, навіть не контекст.стоп (само).
Роланд Кун

1
@RolandKuhn про що context.become?
Ionuț G. Stan

3
context.becomeпозначає поведінку, яку слід застосувати до наступного повідомлення, а це означає, що воно набуває чинності після обробки поточного повідомлення; в цьому плані це дуже схоже context.stop(self).
Roland Kuhn

Відповіді:


328

І те stopй PoisonPillінше припинить актора та припинить чергу повідомлень. Вони змусять актора перестати обробляти повідомлення, надішлюють стоп-дзвінок усім його дітям, зачекають, коли вони припиняться, а потім зателефонують на його postStopгачок. Усі подальші повідомлення надсилаються на поштову скриньку мертвих листів.

Різниця полягає в тому, що повідомлення обробляються до початку цієї послідовності. У випадку stopдзвінка спочатку обробляється повідомлення спочатку завершується, а всі інші відкидаються. Коли ви надсилаєте a PoisonPill, це просто інше повідомлення у черзі, тому послідовність дій почнеться після PoisonPillотримання. Усі повідомлення, які стоять перед ним у черзі, будуть оброблені спочатку.

На противагу цьому, Killповідомлення змушує актора кинути те, ActorKilledExceptionщо обробляється за допомогою звичайного механізму керівника. Тож поведінка тут залежить від того, що ви визначили у своїй стратегії керівника. За замовчуванням - зупинити актора. Але поштова скринька зберігається, тому, коли актор перезавантажиться, у неї все ще будуть старі повідомлення, крім того, що спричинило збій.

Також дивіться розділ "Зупинення актора", "Вбивство актора" в документах:

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

І більше про стратегії нагляду:

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


4
відмінна відповідь спасибі, слід розмістити в навчальному посібнику Акка!
LaloInDublin

16
Повідомлення Kill НЕ викликає перезапуск актора за допомогою звичайного механізму супервізора, якщо ви не використовуєте стратегію супервізора за замовчуванням, оскільки ActorKilledException вирішує зупинити, а не перезапустити.
lisak

Насправді це дуже дратує, оскільки єдиний вбудований спосіб перезапуску акторів - це викид на виняток.
lisak

Або надіслати PoisonPill від контролюючого актора до того, кого слід перезапустити, і запустити його заново.
lisak

Чи є якась різниця при використанні context.stop(self)?
БАР

1

Використовуйте PoisonPill, коли зможете. Він ставиться на поштову скриньку і споживається як і будь-яке інше повідомлення. Ви також можете використовувати "context.stop (self)" з боку актора.


0

PoisonPill асинхронно зупиняє актора після того, як це буде виконано з усіма повідомленнями, які надійшли в поштову скриньку, перед початком PoisonPill.


20
ні, Kill не має особливого пріоритету, як і PoisonPill
Roland Kuhn

0

Ви можете використовувати як зупинку актора, так і таблетку для отруєння, щоб зупинити обробку акторів, і вбити, щоб припинити актора в повному обсязі. x.stop - це дзвінок, який ви здійснюєте в методі отримання akka, замінює стан актора новим актором лише після виклику postStop. х! PoisonPill - це метод, який ви передаєте актору, щоб припинити обробку, коли актор працює (рекомендується). також замінить стан актора після виклику postStop. x.kill припинить актора і видалить актора в акторському Шляху та замінить всього актора на нового актора.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.