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 (odśmiecanie pamięci 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 następuje:

  • Gdy wezwanie przychodzi do aktora i jeden nie jest jeszcze aktywny, tworzony jest nowy aktor.
  • Stan aktora jest ładowany, jeśli jest on utrzymywany.
  • Wywoływana OnActivateAsync 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 dezaktywowaniu 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.
  • Wywoływana OnDeactivateAsync 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.

Napiwek

Środowisko uruchomieniowe Fabric Actors emituje niektóre zdarzenia związane z aktywacją i dezaktywacją aktora. 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ć bezużyteczne 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 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 odśmiecane. 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 mógł zostać zdezaktywowany i odśmiecany. 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);
    }
}

W przypadku każdego aktywnego aktora środowisko uruchomieniowe aktora śledzi czas bezczynności (tj. nie jest używany). Środowisko uruchomieniowe aktora sprawdza każdego z aktorów, ScanIntervalInSeconds aby sprawdzić, czy może to być wyrzucane śmieci i oznacza go, jeśli był bezczynny dla IdleTimeoutInSecondselementu .

Za każdym razem, gdy aktor jest używany, jego czas bezczynności jest resetowany do 0. Po tym aktor może być bezużyteczny zebrany 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ń metody aktora, przypomnień i czasomierzy na okres istnienia 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 aktorów, które mają być wyrzucane śmieci, odbywa się na T=0,5,10,15,20,25, zgodnie z definicją w interwale skanowania 5.
  • Okresowe wyzwalanie czasomierza w 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 wyrzucany śmieci podczas wykonywania jednej 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. Wykonanie 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. Po ponownym aktywowaniu aktora 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ą aktywowane ponownie, może być konieczne wyczyszczenie ich danych. Przykłady usuwania aktorów można znaleźć w artykule Usuwanie aktorów i ich stan.

Następne kroki