Actorlevenscyclus, automatische garbagecollection en handmatig verwijderen

Een actor wordt geactiveerd wanneer een van de methoden voor het eerst wordt aangeroepen. Een actor wordt gedeactiveerd (garbage collected by the Actors runtime) als deze gedurende een configureerbare periode niet wordt gebruikt. Een actor en de bijbehorende status kunnen ook op elk gewenst moment handmatig worden verwijderd.

Actoractivering

Wanneer een actor wordt geactiveerd, gebeurt het volgende:

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

Actor deactiveren

Wanneer een actor is gedeactiveerd, gebeurt het volgende:

  • Wanneer een actor enige tijd niet wordt gebruikt, wordt deze verwijderd uit de tabel Actieve actoren.
  • De OnDeactivateAsync methode (C#) of onDeactivateAsync (Java) (die kan worden overschreven in de actor-implementatie) wordt aangeroepen. Hiermee worden alle timers voor de actor gewist. Actorbewerkingen zoals statuswijzigingen mogen niet worden aangeroepen vanuit deze methode.

Tip

De Fabric Actors-runtime verzendt enkele gebeurtenissen met betrekking tot het activeren en deactiveren van de actor. Ze zijn nuttig bij diagnostische gegevens en prestatiebewaking.

Garbagecollection actor

Wanneer een actor is gedeactiveerd, worden verwijzingen naar het actor-object vrijgegeven en kan het afval zijn dat normaal wordt verzameld door de COMMON Language Runtime (CLR) of java virtual machine (JVM) garbage collector. Garbagecollection schoont alleen het actorobject op; de status die is opgeslagen in state manager van de actor , wordt niet verwijderd. De volgende keer dat de actor wordt geactiveerd, wordt een nieuw actor-object gemaakt en wordt de status ervan hersteld.

Wat telt als '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 callback van de timer wordt aangeroepen, wordt deze niet meegeteld als 'wordt gebruikt'.

Voordat we ingaan op de details van de deactivering, is het belangrijk om de volgende termen te definiëren:

  • Scaninterval. Dit is het interval waarmee de Actors-runtime de tabel Actieve actoren scant op actoren die kunnen worden gedeactiveerd en verzameld. De standaardwaarde hiervoor is 1 minuut.
  • Time-out voor inactiviteit. Dit is de hoeveelheid tijd die een actor nodig heeft om ongebruikt (inactief) te blijven voordat deze kan worden gedeactiveerd en afval 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 actor-runtime bij hoeveel tijd deze inactief is geweest (d.w.w. niet gebruikt). De actorruntime controleert elk van de actoren ScanIntervalInSeconds om te zien of het afval kan zijn dat wordt verzameld en markeert het of deze inactief is geweest voor IdleTimeoutInSeconds.

Wanneer een actor wordt gebruikt, wordt de inactieve tijd opnieuw ingesteld op 0. Hierna kan de actor alleen worden verzameld als deze opnieuw inactief blijft voor IdleTimeoutInSeconds. Zoals u zich herinnert, wordt een actor beschouwd als gebruikt als een actorinterfacemethode of een callback voor een actorherinnering wordt uitgevoerd. Een actor wordt niet beschouwd als gebruikt als 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

In het voorbeeld ziet u de impact van actormethode-aanroepen, herinneringen en timers op de levensduur van deze actor. De volgende punten over het voorbeeld zijn het vermelden waard:

  • ScanInterval en IdleTimeout zijn ingesteld op respectievelijk 5 en 10. (Eenheden zijn hier niet van belang, 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 actor.
  • Een actormethodeaanroep op T=7 stelt de niet-actieve 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 verder.
  • Tijdens de garbagecollection-scan op T=25 overschrijdt de inactiviteitstijd van de actor ten slotte de time-out van inactiviteit van 10 en wordt de actor afval verzameld.

Een actor wordt nooit afval verzameld terwijl deze een van de methoden uitvoert, 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 inactieve tijd van de actor opnieuw in te instellen op 0. Bij het uitvoeren van timer-callbacks wordt de niet-actieve tijd niet opnieuw ingesteld op 0. De garbagecollection van de actor wordt echter uitgesteld totdat de callback van de timer is 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 gegevens ervan opnieuw beschikbaar gesteld via de 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 Actors en hun status verwijderen voor voorbeelden van het verwijderen van actoren.

Volgende stappen