Životní cyklus objektu Actor, automatické uvolňování paměti a ruční odstranění

Objekt actor je aktivován při prvním volání některé z jeho metod. Objekt actor je deaktivován (uvolněný modul runtime herců), pokud se nepoužívá po konfigurovatelné časové období. Objekt actor a jeho stav lze také kdykoli odstranit ručně.

Aktivace objektu Actor

Při aktivaci objektu actor dojde k následujícímu:

  • Když přijde hovor pro aktéra a ten ještě není aktivní, vytvoří se nový aktér.
  • Stav objektu actor se načte, pokud je ve stavu údržby.
  • Volá se OnActivateAsync metoda (C#) nebo onActivateAsync (Java), která může být přepsána v implementaci objektu actor.
  • Objekt actor je nyní považován za aktivní.

Deaktivace objektu Actor

Při deaktivaci objektu actor dojde k následujícímu:

  • Pokud se objekt actor po určitou dobu nepoužívá, odebere se z tabulky Aktivní aktéři.
  • Volá se OnDeactivateAsync metoda (C#) nebo onDeactivateAsync (Java), která může být přepsána v implementaci objektu actor. Tím se vymažou všechny časovače pro aktéra. Operace objektu Actor, jako jsou změny stavu, by se neměly volat z této metody.

Tip

Modul runtime Fabric Actors generuje některé události související s aktivací a deaktivací objektu actor. Jsou užitečné při diagnostice a monitorování výkonu.

Uvolňování paměti objektu Actor

Když je objekt actor deaktivován, uvolní se odkazy na objekt actor a tento objekt může normálně uvolnit z paměti pomocí modulu CLR (Common Language Runtime) nebo prostředí Java Virtual Machine (JVM). Uvolňování paměti pouze vyčistí objekt actor; neodebere stav uložený ve správci stavu objektu. Při příští aktivaci objektu actor se vytvoří nový objekt actor a jeho stav se obnoví.

Co se počítá jako "používání" pro účely deaktivace a uvolňování paměti?

  • Příjem hovoru
  • IRemindable.ReceiveReminderAsync vyvolání metody (platí jenom v případě, že objekt actor používá připomenutí)

Poznámka

Pokud objekt actor používá časovače a je vyvoláno zpětné volání časovače, nezapočítává se jako "použité".

Než se podíváme na podrobnosti deaktivace, je důležité definovat následující termíny:

  • Interval kontroly. Jedná se o interval, ve kterém modul runtime actors prohledá svou tabulku Active Actors na aktéry, které je možné deaktivovat a vyřadit z paměti. Výchozí hodnota je 1 minuta.
  • Časový limit nečinnosti. Jedná se o dobu, po kterou musí objekt actor zůstat nepoužívaný (nečinný), aby mohl být deaktivován a uvolněn z paměti. Výchozí hodnota je 60 minut.

Tyto výchozí hodnoty obvykle nemusíte měnit. V případě potřeby je ale možné tyto intervaly při registraci služby actor změnitActorServiceSettings:

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);
    }
}

Modul runtime objektu actor pro každého aktivního objektu sleduje dobu nečinnosti (tj. nepoužívá se). Modul runtime objektu actor zkontroluje každého z herců, ScanIntervalInSeconds aby zjistil, jestli je možné ho vyměsit z paměti, a označí ho, pokud byl nečinný pro IdleTimeoutInSeconds.

Při každém použití objektu actor se doba nečinnosti resetuje na 0. Poté může být objekt actor uvolněn pouze v případě, že znovu zůstane nečinný pro IdleTimeoutInSeconds. Vzpomeňte si, že objekt actor se považuje za použitý, pokud je spuštěna metoda rozhraní actor nebo zpětné volání připomenutí objektu actor. Objekt actor se nepovažuje za použitý, pokud je spuštěno zpětné volání časovače.

Následující diagram znázorňuje životní cyklus jednoho objektu actor, který ilustruje tyto koncepty.

Příklad doby nečinnosti

Příklad ukazuje dopad volání metod actor, připomenutí a časovačů na životnost tohoto objektu. Za zmínku stojí následující body týkající se příkladu:

  • ScanInterval a IdleTimeout jsou nastavené na 5 a 10. (Na jednotkách tady nezáleží, protože naším účelem je pouze znázornit koncept.)
  • Prohledávání herců, které mají být uvolněny, probíhá v T=0,5,10,15,20,25, jak je definováno intervalem kontroly 5.
  • Periodický časovač se aktivuje při T=4,8,12,16,20,24 a jeho zpětné volání se spustí. Nemá vliv na dobu nečinnosti objektu actor.
  • Volání metody actor v T=7 resetuje dobu nečinnosti na 0 a zpoždí uvolňování paměti objektu actor.
  • Zpětné volání připomenutí objektu actor se spustí při T=14 a dále zpožďuje uvolňování paměti objektu actor.
  • Během kontroly uvolňování paměti v T=25 překročí doba nečinnosti objektu actor časový limit nečinnosti 10 a objekt actor se vymaže.

Objekt actor nebude nikdy uvolněn z paměti, když provádí jednu ze svých metod, bez ohledu na to, kolik času je stráveno prováděním této metody. Jak už bylo zmíněno dříve, spuštění metod rozhraní actor a zpětných volání připomenutí zabraňuje uvolňování paměti tím, že resetuje dobu nečinnosti objektu actor na hodnotu 0. Spuštění zpětných volání časovače neobnoví dobu nečinnosti na hodnotu 0. Uvolňování paměti objektu actor je však odloženo, dokud se nedokončil provádění zpětného volání časovače.

Ruční odstranění herců a jejich stavu

Uvolňování paměti deaktivovaných herců pouze vyčistí objekt actor, ale neodebere data uložená ve správci stavu objektu actor. Při opětovné aktivaci objektu actor jsou jeho data znovu k dispozici prostřednictvím správce stavu. V případech, kdy aktéři ukládají data ve Správci stavu a jsou deaktivována, ale nikdy se znovu neaktivují, může být nutné data vyčistit. Příklady, jak odstranit aktéry, najdete v tématu odstranění aktérů a jejich stavu.

Další kroky