Udostępnij za pośrednictwem


Cykl życia aktora, automatyczne odzyskiwanie pamięci i ręczne usuwanie

Aktor jest aktywowany po raz pierwszy wywołanie do dowolnej z jego metod. Aktor jest dezaktywowany (śmieci zbierane przez środowisko uruchomieniowe aktorów), jeśli nie jest używany przez konfigurowalny okres czasu. Aktor i jego stan można również usunąć ręcznie w dowolnym momencie.

Aktywacja aktora

Po aktywowaniu aktora występują następujące czynności:

  • Gdy wezwanie przychodzi do aktora i jeden nie jest jeszcze aktywny, zostanie utworzony nowy aktor.
  • Stan aktora jest ładowany, jeśli jest on utrzymywany.
  • OnActivateAsync Wywoływana jest metoda (C#) lub onActivateAsync (Java), która może zostać zastąpiona w implementacji aktora.
  • Aktor jest teraz uważany za aktywny.

Dezaktywacja aktora

Po dezaktywacji aktora występują następujące czynności:

  • Gdy aktor nie jest używany przez jakiś czas, zostanie on usunięty z tabeli Active Actors.
  • OnDeactivateAsync Wywoływana jest metoda (C#) lub onDeactivateAsync (Java), która może zostać zastąpiona w implementacji aktora. To czyści wszystkie czasomierze dla aktora. Operacje aktora, takie jak zmiany stanu, nie powinny być wywoływane z tej metody.

Porada

Środowisko uruchomieniowe Fabric Actors emituje niektóre zdarzenia związane z aktywacją aktora i dezaktywacją. Są one przydatne w zakresie diagnostyki i monitorowania wydajności.

Odzyskiwanie pamięci aktora

Gdy aktor jest dezaktywowany, odwołania do obiektu aktora są zwalniane i mogą być one zbierane normalnie przez środowisko uruchomieniowe języka wspólnego (CLR) lub maszynę wirtualną Java (JVM). Odzyskiwanie pamięci usuwa tylko obiekt aktora; nie usuwa stanu przechowywanego w menedżerze stanu aktora. Następnym razem, gdy aktor zostanie aktywowany, zostanie utworzony nowy obiekt aktora, a jego stan zostanie przywrócony.

Co liczy się jako "używane" w celu dezaktywacji i odzyskiwania pamięci?

  • Odbieranie połączenia
  • IRemindable.ReceiveReminderAsync wywoływana metoda (dotyczy tylko wtedy, gdy aktor używa przypomnień)

Uwaga

jeśli aktor używa czasomierzy, a wywołanie zwrotne czasomierza jest wywoływane, nie jest ono liczone jako "używane".

Zanim przejdziemy do szczegółów dezaktywacji, należy zdefiniować następujące terminy:

  • Interwał skanowania. Jest to interwał, w którym środowisko uruchomieniowe aktorów skanuje tabelę Active Actors dla aktorów, które mogą zostać zdezaktywowane i odebrane śmieci. Wartość domyślna dla tej wartości to 1 minuta.
  • Limit czasu bezczynności. Jest to czas, przez jaki aktor musi pozostać nieużywany (bezczynny), zanim będzie można go dezaktywować i zbierać śmieci. Wartość domyślna dla tej wartości to 60 minut.

Zazwyczaj nie trzeba zmieniać tych wartości domyślnych. Jednak w razie potrzeby te interwały można zmienić ActorServiceSettings podczas rejestrowania usługi aktora:

public class Program
{
    public static void Main(string[] args)
    {
        ActorRuntime.RegisterActorAsync<MyActor>((context, actorType) =>
                new ActorService(context, actorType,
                    settings:
                        new ActorServiceSettings()
                        {
                            ActorGarbageCollectionSettings =
                                new ActorGarbageCollectionSettings(10, 2)
                        }))
            .GetAwaiter()
            .GetResult();
    }
}
public class Program
{
    public static void main(String[] args)
    {
        ActorRuntime.registerActorAsync(
                MyActor.class,
                (context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
                timeout);
    }
}

Dla każdego aktywnego aktora środowisko uruchomieniowe aktora śledzi czas bezczynności (tj. nieużywalny). Środowisko uruchomieniowe aktora sprawdza każdego z aktorów, ScanIntervalInSeconds aby sprawdzić, czy może to być śmieci zebrane i oznacza go, jeśli został bezczynny dla IdleTimeoutInSeconds.

Za każdym razem, gdy aktor jest używany, jego czas bezczynności jest resetowany do 0. Po tym aktor może być odśmiecany tylko wtedy, gdy ponownie pozostanie bezczynny dla IdleTimeoutInSeconds. Pamiętaj, że aktor jest uważany za używany, jeśli jest wykonywana metoda interfejsu aktora lub wywołanie zwrotne przypomnienia aktora. Aktor nie jest uważany za używany, jeśli jego wywołanie zwrotne czasomierza jest wykonywane.

Na poniższym diagramie przedstawiono cykl życia pojedynczego aktora, aby zilustrować te pojęcia.

Przykład czasu bezczynności

W przykładzie pokazano wpływ wywołań metod aktora, przypomnień i czasomierzy na całe życie tego aktora. Warto wspomnieć o następujących kwestiach dotyczących przykładu:

  • Wartości ScanInterval i IdleTimeout są ustawione odpowiednio na 5 i 10. (Jednostki nie mają tu znaczenia, ponieważ naszym celem jest tylko zilustrowanie koncepcji).
  • Skanowanie dla aktorów, które mają być zbierane, odbywa się na T=0,5,10,15,20,25 zgodnie z interwałem skanowania wynoszącym 5.
  • Czasomierz okresowy jest uruchamiany przy T=4,8,12,16,20,24, a jego wywołanie zwrotne jest wykonywane. Nie ma to wpływu na czas bezczynności aktora.
  • Wywołanie metody aktora w T=7 resetuje czas bezczynności do 0 i opóźnia odzyskiwanie pamięci aktora.
  • Wywołanie zwrotne przypomnienia aktora jest wykonywane w T=14 i dodatkowo opóźnia odzyskiwanie pamięci aktora.
  • Podczas skanowania odzyskiwania pamięci w T=25 czas bezczynności aktora w końcu przekracza limit czasu bezczynności 10, a aktor jest bezużyteczny.

Aktor nigdy nie będzie zbierany śmieci, gdy wykonuje jedną z jego metod, bez względu na to, ile czasu poświęca się na wykonywanie tej metody. Jak wspomniano wcześniej, wykonywanie metod interfejsu aktora i wywołań zwrotnych przypomnień uniemożliwia odzyskiwanie pamięci przez zresetowanie czasu bezczynności aktora do 0. Wykonywanie wywołań zwrotnych czasomierza nie powoduje zresetowania czasu bezczynności do 0. Jednak odzyskiwanie pamięci aktora jest odroczone do momentu zakończenia wykonywania wywołania zwrotnego czasomierza.

Ręczne usuwanie aktorów i ich stanu

Odzyskiwanie pamięci dezaktywowanych aktorów powoduje tylko wyczyszczenie obiektu aktora, ale nie powoduje usunięcia danych przechowywanych w menedżerze stanu aktora. Gdy aktor zostanie ponownie aktywowany, jego dane są ponownie udostępniane za pośrednictwem Menedżera stanu. W przypadkach, gdy aktorzy przechowują dane w menedżerze stanu i są dezaktywowane, ale nigdy nie są ponownie aktywowane, może być konieczne wyczyszczenie ich danych. Aby zapoznać się z przykładami usuwania aktorów, przeczytaj temat Usuń aktorów i ich stan.

Następne kroki