Delen via


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.

Actor activering

Wanneer een actor wordt geactiveerd, gebeurt het volgende:

  • Wanneer er een oproep voor een actor binnenkomt en er nog geen actor actief is, wordt er een nieuwe actor gecreëerd.
  • De status van de actor wordt geladen als deze de status behoudt.
  • De methode OnActivateAsync (C#) of onActivateAsync (Java), die kan worden overschreven in de actor-implementatie, wordt aangeroepen.
  • De acteur wordt nu als actief beschouwd.

Deactivering van de actor

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 methode OnDeactivateAsync (C#) of onDeactivateAsync (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.

Hint

De Fabric Actors-runtime verzendt enkele gebeurtenissen met betrekking tot de activering en deactivering van de actor. Ze zijn nuttig voor diagnostiek en prestatiebewaking.

Actor afvalverzameling

Wanneer een actor is gedeactiveerd, worden verwijzingen naar het actorobject vrijgegeven en kan het normaal worden opgeruimd door de garbagecollector van de common language runtime (CLR) of Java Virtual Machine (JVM). Garbagecollection schoont alleen het actorobject op; de status die is opgeslagen in de State Manager van de actor wordt niet verwijderd. 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 waarop de Actors-runtime de Active Actors-tabel scant op actoren die gedeactiveerd kunnen worden en afval verzameld kunnen worden. 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 een actor inactief is, dus niet gebruikt wordt. 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 door de garbage collector worden opgeruimd als deze opnieuw inactief blijft voor IdleTimeoutInSeconds. Onthoud dat een actor als gebruikt wordt beschouwd als ofwel een actor-interface methode of een callback van een actorherinnering wordt uitgevoerd. Een actor wordt niet als gebruikt beschouwd wanneer de timer-callback wordt uitgevoerd.

In het volgende diagram ziet u de levenscyclus van één actor om deze concepten te illustreren.

Voorbeeld van niet-actieve tijd

Het voorbeeld toont de impact van actormethode-aanroepen, herinneringen en timers op 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 moeten worden opgeruimd, vindt plaats bij T=0, 5, 10, 15, 20, 25, zoals gedefinieerd door het scaninterval van 5 seconden.
  • 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 tijdherinnering-callback wordt uitgevoerd om T=14 en vertraagt de garbageverzameling van de actor verder.
  • Tijdens de vuilnisopruimingsscan op T=25 overschrijdt de inactieve tijd van de actor uiteindelijk de time-out voor inactiviteit van 10 en wordt de actor opgeruimd.

Een actor zal nooit worden opgeruimd door de garbagecollector tijdens het uitvoeren van een van zijn methoden, ongeacht hoeveel tijd er wordt besteed aan het uitvoeren van die methode. Zoals eerder vermeld, voorkomt de uitvoering van actorinterface-methoden en herinnerings-callbacks garbage collection door de inactieve tijd van de actor op 0 terug te zetten. 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.

Volgende stappen