Akka Kill vs. Stop vs. Poison Pill?

212

Pytanie Akka dla początkujących - czytam Akka Essentials, czy ktoś mógłby wyjaśnić różnicę między Akka Stop / Poison Pill a Kill? Książka zawiera tylko małe wyjaśnienie: „Zabijanie jest synchroniczne, a pigułka z trucizną jest asynchroniczna”. Ale w jaki sposób? Czy wątek wzywającego aktora blokuje się w tym czasie? Czy aktorzy-dzieci są powiadamiani podczas zabijania, przywołani po postu itp. Przykładowe zastosowania jednej koncepcji a drugiej?

Wielkie dzięki!

LaloInDublin
źródło
12
rs_atl odpowiedział na to bardzo dobrze, dodam tylko, że nic o aktorach nie jest synchroniczne, nawet kontekst. stop (jaźń).
Roland Kuhn
1
@RolandKuhn o czym context.become?
Ionuț G. Stan
3
context.becomeoznacza zachowanie, które należy zastosować do następnej wiadomości, co oznacza, że ​​zadziała ona po przetworzeniu bieżącej wiadomości; pod tym względem jest całkiem jak context.stop(self).
Roland Kuhn

Odpowiedzi:

328

Zarówno stopi PoisonPillzakończy działanie aktora i zatrzyma kolejkę komunikatów. Spowodują, że aktor zaprzestanie przetwarzania wiadomości, wyśle ​​wezwanie stop do wszystkich swoich dzieci, zaczeka na ich zakończenie, a następnie zadzwoni do postStophaka. Wszystkie dalsze wiadomości są wysyłane do skrzynki z martwymi listami.

Różnica polega na tym, że wiadomości są przetwarzane przed rozpoczęciem tej sekwencji. W przypadku stoppołączenia aktualnie przetwarzana wiadomość jest najpierw uzupełniana, a wszystkie pozostałe są odrzucane. Podczas wysyłania a PoisonPilljest to po prostu kolejna wiadomość w kolejce, więc sekwencja rozpocznie się po PoisonPillodebraniu. Wszystkie wiadomości znajdujące się przed nią w kolejce zostaną przetworzone w pierwszej kolejności.

Natomiast Killkomunikat powoduje, że aktor wyrzuca ten, ActorKilledExceptionktóry jest obsługiwany przy użyciu normalnego mechanizmu nadzorczego. Zatem zachowanie tutaj zależy od tego, co zdefiniowałeś w strategii swojego przełożonego. Domyślnie aktor jest zatrzymany. Ale skrzynka pocztowa nadal się utrzymuje, więc gdy aktor uruchomi się ponownie, nadal będzie mieć stare wiadomości, z wyjątkiem tej, która spowodowała awarię.

Zobacz także sekcję „Zatrzymanie aktora”, „Zabicie aktora” w dokumentacji:

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

I więcej na temat strategii nadzoru:

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

rs_atl
źródło
4
doskonała odpowiedź, dziękuję, powinien zostać opublikowany w samouczku Akka!
LaloInDublin
16
Komunikat zabicia NIE powoduje ponownego uruchomienia aktora przy użyciu normalnego mechanizmu nadzorcy, chyba że zastosujesz inną niż domyślną strategię nadzoru, ponieważ ActorKilledException rozwiązuje problem Zatrzymaj, a nie Uruchom ponownie.
lisak
W rzeczywistości jest to dość irytujące, ponieważ jedynym wbudowanym sposobem ponownego uruchomienia aktorów jest zgłoszenie wyjątku.
lisak
Lub wysyłanie PoisonPill od aktora nadzorującego do aktora, który powinien zostać zrestartowany i uruchomić go ponownie.
lisak
Czy jest jakaś różnica, jeśli używasz context.stop(self)?
BAR
1

Używaj PoisonPill, kiedy tylko możesz. Jest on umieszczany na skrzynce pocztowej i jest zużywany jak każda inna wiadomość. Możesz także użyć „context.stop (self)” z poziomu aktora.

JohnUK
źródło
0

PoisonPill asynchronicznie zatrzymuje aktora po zakończeniu wszystkich wiadomości odebranych do skrzynki pocztowej przed PoisonPill.

idonnie
źródło
20
nie, Kill nie ma żadnego specjalnego priorytetu, tak jak PoisonPill
Roland Kuhn
0

Możesz użyć zarówno zatrzymania aktora, jak i pigułki z trucizną, aby zatrzymać przetwarzanie aktorów, i zabić, aby zakończyć aktora w całości. x.stop to wywołanie wykonane metodą akka, zastąpi ono stan aktora nowym aktorem po wywołaniu postStop. x! PoisonPill to metoda przekazywana aktorowi w celu zatrzymania przetwarzania, gdy aktor jest uruchomiony (zalecane). zastąpi również stan aktora po wywołaniu postStop. x.kill spowoduje zakończenie działania aktora i usunięcie aktora ze ścieżki aktora i zastąpienie całego aktora nowym aktorem.

JayaChandra S Reddy
źródło