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#) elleronActivateAsync
(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#) elleronDeactivateAsync
(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.
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.