Actor-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 aktör 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.

Dricks

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

Skräpinsamling för aktör

När en aktör inaktiveras släpps referenser till aktörsobjektet och det kan vara skräp som normalt samlas in av clr- eller JVM-skräpinsamlaren (Common Language Runtime). 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)

Kommentar

Om aktören använder timers och dess timer-motringning anropas räknas den 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 måste 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 dock dessa intervall ändras när ActorServiceSettings du registrerar din aktörstjänst:

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 för att se om det kan samlas in skräp och markerar om det har varit inaktivt för IdleTimeoutInSeconds.

När en aktör används återställs den inaktiva tiden till 0. Efter detta kan aktören endast samlas in skräp om den återigen 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åminnelseanrop 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å inaktiv tid

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 för aktörer som ska samlas in av skräp 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.
  • Ett återanrop för aktörspåminnelse körs på T=14 och fördröjer ytterligare skräpinsamlingen för aktören.
  • Under genomsökningen av skräpinsamlingen vid T=25 överskrider aktörens inaktivitetstid slutligen tidsgränsen för inaktivitet på 10 och aktören samlas in skräp.

En aktör kommer aldrig att vara skräp som samlas in 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 metoder för aktörsgränssnitt 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 manuellt och deras tillstånd

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 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