Megosztás a következőn keresztül:


Aktor életciklusa, automatikus szemétgyűjtés és manuális törlés

Az aktor az első alkalommal aktiválódik, amikor hívást kezdeményeznek bármelyik metódusához. Az aktor inaktiválva van (az Actors-futtatókörnyezet által gyűjtött szemét), ha nem konfigurálható ideig használják. Az aktorok és állapotuk bármikor törölhetők manuálisan is.

Aktor aktiválása

Az aktor aktiválásakor a következők történnek:

  • Amikor hívás érkezik egy szereplőhöz, és egy még nem aktív, létrejön egy új aktor.
  • A színész állapota betöltődik, ha fenntartja az állapotot.
  • A OnActivateAsync (C#) vagy onActivateAsync (Java) metódust (amely felül lehet bírálni az aktor implementációjában) meghívja.
  • A színészt most aktívnak tekintik.

Aktor inaktiválása

Az aktor inaktiválásakor a következők történnek:

  • Ha egy aktort bizonyos ideig nem használ, a rendszer eltávolítja az Aktív aktorok táblából.
  • A OnDeactivateAsync (C#) vagy onDeactivateAsync (Java) metódust (amely felül lehet bírálni az aktor implementációjában) meghívja. Ez törli az összes időzítőt a színész számára. Az aktorműveleteket, például az állapotváltozásokat nem szabad meghívni ebből a metódusból.

Tipp

A Háló aktorok futtatókörnyezete aktoraktiválással és -inaktiválással kapcsolatos eseményeket bocsát ki. A diagnosztikában és a teljesítménymonitorozásban hasznosak.

Aktor szemétgyűjtése

Ha egy aktor inaktiválva van, a rendszer felszabadítja az aktorobjektumra mutató hivatkozásokat, és azokat a szokásos nyelvi futtatókörnyezet (CLR) vagy Java virtuális gép (JVM) szemétgyűjtője gyűjti össze. A szemétgyűjtés csak az aktorobjektumot tisztítja meg; nem távolítja el a színész Állapotkezelőjében tárolt állapotot. Az aktor következő aktiválásakor a rendszer létrehoz egy új aktorobjektumot, és visszaállítja az állapotát.

Mi számít "használatban" az inaktiválás és a szemétgyűjtés céljából?

  • Hívás fogadása
  • IRemindable.ReceiveReminderAsync metódus meghívása (csak akkor alkalmazható, ha az aktor emlékeztetőket használ)

Megjegyzés

ha az aktor időzítőket használ, és az időzítő visszahívása meg van hívva, nem számít "használatban" állapotnak.

Mielőtt belemennénk az inaktiválás részleteibe, fontos definiálni a következő kifejezéseket:

  • Vizsgálati időköz. Ez az az időtartam, amikor az Actors-futtatókörnyezet megvizsgálja az Active Actors táblát az inaktiválható és a begyűjtött szemét után. Ennek alapértelmezett értéke 1 perc.
  • Üresjárati időtúllépés. Ez az az időtartam, amellyel az aktornak használaton kívül kell maradnia (tétlen) ahhoz, hogy inaktiválható legyen, és a szemétgyűjtést. Ennek alapértelmezett értéke 60 perc.

Ezeket az alapértelmezett beállításokat általában nem kell módosítania. Szükség esetén azonban ezek az intervallumok módosíthatók ActorServiceSettings az Aktor szolgáltatás regisztrálásakor:

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);
    }
}

Minden aktív aktor esetében az aktor futtatókörnyezete nyomon követi, hogy mennyi ideig tétlen volt (azaz nem használták). Az aktor-futtatókörnyezet minden ScanIntervalInSeconds szereplőt ellenőriz, hogy lehet-e szemétgyűjtést végez, és megjelöli, ha tétlen volt a esetében IdleTimeoutInSeconds.

Az aktorok használatakor a tétlenségi idő 0-ra változik. Ezt követően a színész csak akkor gyűjthető szemétként, ha ismét tétlen marad a számára IdleTimeoutInSeconds. Ne feledje, hogy az aktort akkor tekintik használatnak, ha egy aktor felületi módszerét vagy egy aktoremlék-visszahívást hajtanak végre. Az aktor nem minősül használtnak, ha az időzítő visszahívása végre lett hajtva.

Az alábbi ábrán egyetlen szereplő életciklusa látható, amely szemlélteti ezeket a fogalmakat.

Példa üresjárati időre

A példa az aktor metódushívásainak, emlékeztetőinek és időzítőinek a szereplő élettartamára gyakorolt hatását mutatja be. A példával kapcsolatos alábbi szempontokat érdemes megemlíteni:

  • A ScanInterval és az IdleTimeout értéke 5, illetve 10. (Az egységek itt nem számítanak, mivel a célunk csak a koncepció szemléltetése.)
  • Az összegyűjtött aktorok vizsgálata a T=0,5,10,15,20,25 időpontban történik, az 5 vizsgálati időköz által meghatározott módon.
  • A rendszeres időzítő T=4,8,12,16,20,24 értékre aktiválódik, és a visszahívása végrehajtja. Ez nem befolyásolja a színész tétlen idejét.
  • A T=7-nél egy aktormetódus hívása 0-ra állítja vissza az üresjárati időt, és késlelteti az aktor szemétgyűjtését.
  • Az aktor-emlékeztető visszahívása a T=14-nél történik, és tovább késlelteti az aktor szemétgyűjtését.
  • A T=25-ös szemétgyűjtési vizsgálat során a színész tétlen ideje végül meghaladja a 10 tétlen időtúllépését, és az aktor szemétgyűjtésre kerül.

A színészek soha nem lesznek szemét gyűjtve, miközben az egyik metódust hajtják végre, függetlenül attól, hogy mennyi időt töltenek a metódus végrehajtásával. Ahogy korábban említettük, az aktor felületi metódusainak és emlékeztető visszahívásainak végrehajtása megakadályozza a szemétgyűjtést azáltal, hogy az aktor üresjárati idejét 0-ra állítja vissza. Az időzítő visszahívásainak végrehajtása nem állítja vissza az üresjárati időt 0-ra. Az aktor szemétgyűjtése azonban késleltetve lesz, amíg az időzítő visszahívása befejezi a végrehajtást.

Aktorok és állapotuk manuális törlése

Az inaktivált aktorok szemétgyűjtése csak az aktorobjektumot törli, de nem távolítja el az aktor Állapotkezelőjében tárolt adatokat. Az aktor újraaktiválása után a rendszer ismét elérhetővé teszi az adatokat a State Manageren keresztül. Azokban az esetekben, amikor a szereplők adatokat tárolnak a State Managerben, és inaktiválva vannak, de soha nem aktiválódnak újra, szükség lehet az adataik törlésére. Példák a színészek törlésére, a törlési aktorok és állapotuk olvasására.

Következő lépések