Dzisiaj zacząłem pisać post o hierarchii aktorów. Jest to bardzo ważny element w celu osiągnięcia skalowalności i dobrej obsługi błędów (np. poprzez izolacje wadliwych aktorów).
W połowie jednak stwierdziłem, że najpierw wypada napisać krótki wpis o zdarzeniach (hooks), jakie możemy zdefiniować w AKKA. Pozwoli nam to potem lepiej zrozumieć przepływ informacji w hierarchiach aktorów.
Każdy aktor, może znajdować się w następujących etapach:
- Starting – aktor został dopiero stworzony i nie przetwarza jeszcze wiadomości
- Receiving – aktor może teraz otrzymywać wiadomości
- Stopping – zwalnianie zasobów
- Terminated – aktor nie może już otrzymywać wiadomości, ponadto w tym stanie, nie może zostać już wznowiony.
- Restarting – aktor aktualnie jest resetowany. Oznacza to, że po restarcie może przejść do “Starting”, a potem do “Receiving”, czyli będzie w stanie ponownie przetwarzać wiadomości.
Z perspektywy kodu, poszczególne stany można obserwować, przeciążając odpowiednie metody:
- OnStart (Starting) – metoda wywołana przed rozpoczęciem otrzymywania jakichkolwiek wiadomości
- PostStop (Stopping) – zwalnianie zasobów
- PreRestart – przed rozpoczęciem restartu.
- PostRestart po zakończeniu restartu, ale jeszcze przed ponownym wywołaniem OnStart.
Kod:
class FooActor : UntypedActor { protected override void OnReceive(object message) { Console.WriteLine("Received: {0}", message); } protected override void PreStart() { Console.WriteLine("PreStart"); base.PreStart(); } protected override void PostStop() { Console.WriteLine("PostStop"); base.PostStop(); } protected override void PreRestart(Exception reason, object message) { Console.WriteLine("PreRestart"); base.PreRestart(reason, message); } protected override void PostRestart(Exception reason) { Console.WriteLine("PostRestart"); base.PostRestart(reason); } }
W celu przetestowania możemy:
var system = ActorSystem.Create("system"); var actor = system.ActorOf<FooActor>(); actor.Tell("Hello World!"); system.Shutdown(); system.AwaitTermination();
Poszczególne metody, przydadzą się w następnym wpisie, poświęconym hierarchii aktorów oraz relacjami między aktorami. Każdy z aktorów może być zarządcą więc śledzenie czasu życia aktorów jest pomocne w zrozumieniu tych zasad.