Levenscyclus van actor, automatische garbagecollection en handmatig verwijderen
Een actor wordt geactiveerd wanneer een aanroep voor het eerst wordt uitgevoerd op een van de methoden. Een actor wordt gedeactiveerd (garbage verzameld door de Actors-runtime) als deze niet wordt gebruikt voor een configureerbare periode. Een actor en de status ervan kunnen op elk gewenst moment ook handmatig worden verwijderd.
Actoractivering
Wanneer een actor wordt geactiveerd, gebeurt het volgende:
- Wanneer er een oproep voor een acteur wordt weergegeven en er nog geen acteur actief is, wordt er een nieuwe actor gemaakt.
- De status van de actor wordt geladen als deze de status onderhoudt.
- De
OnActivateAsync
methode (C#) ofonActivateAsync
(Java) (die kan worden overschreven in de actor-implementatie) wordt aangeroepen. - De acteur wordt nu als actief beschouwd.
Actordeactivatie
Wanneer een actor is gedeactiveerd, gebeurt het volgende:
- Wanneer een actor gedurende een bepaalde periode niet wordt gebruikt, wordt deze verwijderd uit de tabel Active Actors.
- De
OnDeactivateAsync
methode (C#) ofonDeactivateAsync
(Java) (die kan worden overschreven in de actor-implementatie) wordt aangeroepen. Hiermee worden alle timers voor de acteur gewist. Actorbewerkingen zoals statuswijzigingen mogen niet worden aangeroepen vanuit deze methode.
Tip
De Fabric Actors-runtime verzendt enkele gebeurtenissen met betrekking tot de activering en deactivering van de actor. Ze zijn handig in diagnostische gegevens en prestatiebewaking.
Actor garbagecollection
Wanneer een actor is gedeactiveerd, worden verwijzingen naar het actorobject vrijgegeven en kan het normaal worden verzameld door de common language runtime (CLR) of JVM -garbagecollector (Java Virtual Machine). Garbagecollection schoont alleen het actorobject op; de status wordt niet verwijderd die is opgeslagen in state manager van de actor. De volgende keer dat de actor wordt geactiveerd, wordt een nieuw actorobject gemaakt en wordt de status ervan hersteld.
Wat telt als 'wordt gebruikt' voor deactivering en garbagecollection?
- Een oproep ontvangen
IRemindable.ReceiveReminderAsync
methode die wordt aangeroepen (alleen van toepassing als de actor herinneringen gebruikt)
Notitie
als de actor timers gebruikt en de timer-callback wordt aangeroepen, wordt deze niet meegeteld als 'gebruikt'.
Voordat we ingaan op de details van deactiveren, is het belangrijk om de volgende termen te definiëren:
- Scaninterval. Dit is het interval waarmee de Actors-runtime de Active Actors-tabel scant op actoren die kunnen worden gedeactiveerd en garbagecollection. De standaardwaarde hiervoor is 1 minuut.
- Time-out voor inactiviteit. Dit is de hoeveelheid tijd die een actor ongebruikt moet blijven (niet-actief) voordat deze kan worden gedeactiveerd en garbagecollection kan worden verzameld. De standaardwaarde hiervoor is 60 minuten.
Normaal gesproken hoeft u deze standaardinstellingen niet te wijzigen. Indien nodig kunnen deze intervallen echter worden gewijzigd bij ActorServiceSettings
het registreren van uw Actor-service:
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);
}
}
Voor elke actieve actor houdt de actorruntime bij hoeveel tijd deze niet actief is (dat wil gezegd niet worden gebruikt). De actorruntime controleert elk ScanIntervalInSeconds
van de actoren om te zien of het afval kan worden verzameld en markeert het als het niet actief is geweest voor IdleTimeoutInSeconds
.
Wanneer een actor wordt gebruikt, wordt de niet-actieve tijd opnieuw ingesteld op 0. Hierna kan de actor alleen worden verzameld als het opnieuw inactief blijft voor IdleTimeoutInSeconds
. Zoals u weet, wordt een actor beschouwd als gebruikt als een actorinterfacemethode of een callback van een actorherinnering wordt uitgevoerd. Een actor wordt niet als gebruikt beschouwd als de timer-callback wordt uitgevoerd.
In het volgende diagram ziet u de levenscyclus van één actor om deze concepten te illustreren.
In het voorbeeld ziet u de impact van actormethode-aanroepen, herinneringen en timers tijdens de levensduur van deze actor. De volgende punten over het voorbeeld zijn de moeite waard om te vermelden:
- ScanInterval en IdleTimeout zijn respectievelijk ingesteld op 5 en 10. (Eenheden maken hier niet uit, omdat ons doel alleen is om het concept te illustreren.)
- De scan voor actoren die afval moeten worden verzameld, vindt plaats bij T=0,5.10.15.20.25, zoals gedefinieerd door het scaninterval van 5.
- Een periodieke timer wordt geactiveerd op T=4.8.12.16.20.24 en de callback wordt uitgevoerd. Dit heeft geen invloed op de niet-actieve tijd van de acteur.
- Een actormethodeaanroep bij T=7 stelt de inactieve tijd opnieuw in op 0 en vertraagt de garbagecollection van de actor.
- Een callback van een actorherinnering wordt uitgevoerd op T=14 en vertraagt de garbagecollection van de actor.
- Tijdens de garbagecollectionscan op T=25 overschrijdt de niet-actieve tijd van de actor ten slotte de time-out voor inactiviteit van 10 en wordt de actor garbagecollection verzameld.
Een actor zal nooit garbagecollection worden verzameld tijdens het uitvoeren van een van de methoden, ongeacht hoeveel tijd er wordt besteed aan het uitvoeren van die methode. Zoals eerder vermeld, voorkomt de uitvoering van actorinterfacemethoden en callbacks voor herinneringen garbagecollection door de niet-actieve tijd van de actor opnieuw in te schakelen op 0. De uitvoering van timer-callbacks stelt de niet-actieve tijd niet opnieuw in op 0. De garbagecollection van de actor wordt echter uitgesteld totdat de timer callback de uitvoering heeft voltooid.
Actoren en hun status handmatig verwijderen
Garbagecollection van gedeactiveerde actoren schoont alleen het actorobject op, maar verwijdert geen gegevens die zijn opgeslagen in de State Manager van een actor. Wanneer een actor opnieuw wordt geactiveerd, worden de bijbehorende gegevens opnieuw beschikbaar gesteld via State Manager. In gevallen waarin actoren gegevens opslaan in State Manager en worden gedeactiveerd maar nooit opnieuw worden geactiveerd, kan het nodig zijn om hun gegevens op te schonen. Lees actoren en hun status voor voorbeelden van het verwijderen van actoren.