Dela via


Aktörens livscykel, automatisk skräpinsamling och manuell borttagning

En aktör aktiveras första gången ett anrop görs till någon av dess metoder. En aktör inaktiveras (skräp samlas in av Actors-körningen) om den inte används under en konfigurerbar tidsperiod. En aktör och dess tillstånd kan också tas bort manuellt när som helst.

Aktörsaktivering

När en aktör aktiveras inträffar följande:

  • När ett anrop kommer för en skådespelare och en inte redan är aktiv skapas en ny aktör.
  • Aktörens tillstånd läses in om det underhåller tillståndet.
  • Metoden OnActivateAsync (C#) eller onActivateAsync (Java) (som kan åsidosättas i aktörsimplementeringen) anropas.
  • Skådespelaren anses nu vara aktiv.

Aktörsaktivering

När en aktör inaktiveras inträffar följande:

  • När en aktör inte används under en viss tidsperiod tas den bort från tabellen Active Actors.
  • Metoden OnDeactivateAsync (C#) eller onDeactivateAsync (Java) (som kan åsidosättas i aktörsimplementeringen) anropas. Detta rensar alla timers för skådespelaren. Aktörsåtgärder som tillståndsändringar bör inte anropas från den här metoden.

Tips

Fabric Actors-körningen genererar vissa händelser som rör aktörsaktivering och inaktivering. De är användbara vid diagnostik och prestandaövervakning.

Aktörs skräpinsamling

När en aktör inaktiveras frigörs referenser till aktörsobjektet och det kan vara skräp som normalt samlas in av CLR-skräpinsamlaren (Common Language Runtime) eller JVM-skräpinsamlaren (Java Virtual Machine). Skräpinsamling rensar endast aktörsobjektet. det tar inte bort tillstånd som lagras i aktörens State Manager. Nästa gång aktören aktiveras skapas ett nytt aktörsobjekt och dess tillstånd återställs.

Vad räknas som "används" för inaktivering och skräpinsamling?

  • Ta emot ett samtal
  • IRemindable.ReceiveReminderAsync -metod som anropas (gäller endast om aktören använder påminnelser)

Anteckning

Om aktören använder timers och dess timeråteranrop anropas räknas det inte som "används".

Innan vi går in på information om inaktivering är det viktigt att definiera följande termer:

  • Genomsökningsintervall. Det här är intervallet då Actors-körningen genomsöker sin Active Actors-tabell efter aktörer som kan inaktiveras och skräp samlas in. Standardvärdet för detta är 1 minut.
  • Tidsgräns för inaktivitet. Det här är den tid som en aktör behöver för att förbli oanvänd (inaktiv) innan den kan inaktiveras och skräp samlas in. Standardvärdet för detta är 60 minuter.

Normalt behöver du inte ändra dessa standardvärden. Om det behövs kan dessa intervall dock ändras när ActorServiceSettings du registrerar aktörstjänsten:

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

För varje aktiv aktör håller aktörskörningen reda på hur lång tid den har varit inaktiv (dvs. inte används). Aktörskörningen kontrollerar var och en av aktörerna ScanIntervalInSeconds var och en för att se om det kan samlas in skräp och markerar det om det har varit inaktivt för IdleTimeoutInSeconds.

När en aktör används återställs inaktivitetstiden till 0. Efter detta kan aktören endast skräp samlas in om den igen förblir inaktiv för IdleTimeoutInSeconds. Kom ihåg att en aktör anses ha använts om antingen en aktörsgränssnittsmetod eller en aktörspåminnelseåteranrop körs. En aktör anses inte ha använts om dess timeråteranrop körs.

Följande diagram visar livscykeln för en enskild aktör för att illustrera dessa begrepp.

Exempel på inaktivitetstid

Exemplet visar effekten av aktörsmetodanrop, påminnelser och timers på aktörens livslängd. Följande punkter om exemplet är värda att nämna:

  • ScanInterval och IdleTimeout är inställda på 5 respektive 10. (Enheter spelar ingen roll här, eftersom vårt syfte bara är att illustrera konceptet.)
  • Genomsökningen efter aktörer som ska skräpinsamling sker vid T=0,5,10,15,20,25, enligt definitionen av genomsökningsintervallet på 5.
  • En periodisk timer utlöses vid T=4,8,12,16,20,24, och dess återanrop körs. Det påverkar inte aktörens inaktivitetstid.
  • Ett aktörsmetodanrop på T=7 återställer inaktivitetstiden till 0 och fördröjer skräpinsamlingen för aktören.
  • En aktörspåminnelseåteranrop körs på T=14 och fördröjer aktörens skräpinsamling ytterligare.
  • Under genomsökningen av skräpinsamlingen på T=25 överskrider aktörens inaktivitetstid slutligen tidsgränsen för inaktivitet på 10 och aktören är skräpinsamling.

En aktör kommer aldrig att vara skräpinsamling när den kör en av sina metoder, oavsett hur mycket tid som ägnas åt att köra den metoden. Som tidigare nämnts förhindrar körningen av aktörsgränssnittsmetoder och återanrop av påminnelser skräpinsamling genom att återställa aktörens inaktiva tid till 0. Körningen av timeråteranrop återställer inte inaktivitetstiden till 0. Skräpinsamlingen för aktören skjuts dock upp tills timerns återanrop har slutfört körningen.

Ta bort aktörer och deras tillstånd manuellt

Skräpinsamling av inaktiverade aktörer rensar bara aktörsobjektet, men det tar inte bort data som lagras i en aktörs state manager. När en aktör återaktiveras görs dess data återigen tillgängliga för den via State Manager. I de fall där aktörer lagrar data i State Manager och inaktiveras men aldrig återaktiveras kan det vara nödvändigt att rensa deras data. Exempel på hur du tar bort aktörer finns i Ta bort aktörer och deras tillstånd.

Nästa steg