Aktor életciklus, automatikus szemétgyűjtés és kézi törlés
A színész aktiválása az első alkalommal történik, amikor a metódusok bármelyikére hívást kezdeményeznek. A rendszer inaktiválja a színészeket (az Actors-futtatókörnyezet által gyűjtött szemét), ha nem konfigurálható ideig használják. A színészek és állapotuk bármikor manuálisan is törölhetők.
Aktor aktiválása
Egy színész aktiválásakor a következő történik:
- Ha egy színész hívása érkezik, és az egyik még nem aktív, létrejön egy új szereplő.
- A színész állapota betöltődik, ha fenntartja az állapotot.
- A
OnActivateAsync
(C#) vagyonActivateAsync
(Java) metódust (amely felül lehet bírálni az aktor implementációjában) meghívjuk. - A színész most aktívnak számít.
Aktor inaktiválása
Ha egy színész inaktiválva van, a következő történik:
- Ha egy színészt bizonyos ideig nem használnak, az el lesz távolítva az Active Actors táblából.
- A
OnDeactivateAsync
(C#) vagyonDeactivateAsync
(Java) metódust (amely felül lehet bírálni az aktor implementációjában) meghívjuk. Ez törli az összes időzítőt a színész számára. Az aktorműveletek, például az állapotváltozások nem hívhatók meg ebből a metódusból.
Tipp.
A Háló aktorok futtatókörnyezete kibocsát néhány , a színész aktiválásával és inaktiválással kapcsolatos eseményt. A diagnosztikában és a teljesítménymonitorozásban hasznosak.
Aktor szemétgyűjtése
Az aktor inaktiválásakor a rendszer az aktorobjektumra mutató hivatkozásokat bocsát ki, és a szokásos nyelvi futtatókörnyezet (CLR) vagy Java virtuális gép (JVM) szemétgyűjtője által általában gyűjtött szemét lehet. 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. A színész következő aktiválásakor létrejön egy új aktorobjektum, és visszaállítja az állapotát.
Mi számít "használatnak" a deaktivá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)
Feljegyzés
ha az aktor időzítőket használ, és az időzítő visszahívása meg van hívva, az nem számít "használatban" állapotnak.
Mielőtt belemennénk a deaktiválás részleteibe, fontos meghatározni a következő kifejezéseket:
- Vizsgálati időköz. Ez az az időtartam, amikor az Actors-futtatókörnyezet megvizsgálja az Aktív Actors-táblát az inaktiválható és a szemétgyűjtéshez használható színészek számára. Ennek alapértelmezett értéke 1 perc.
- Tétlen időtúllépés. Ez az az idő, amellyel egy színésznek használaton kívül kell maradnia (tétlen), mielőtt inaktiválható lenne, és a szemét begyűjthető lenne. 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 szereplő esetében a színész futásideje nyomon követi, hogy mennyi időt töltött tétlenként (azaz nem használta). A színész futásideje minden ScanIntervalInSeconds
szereplőt ellenőriz, hogy lehet-e szemét gyűjtve, és megjelöli, ha tétlen IdleTimeoutInSeconds
volt.
Amikor egy színészt használ, a tétlenségi ideje 0-ra lesz visszaállítva. Ezt követően a színész csak akkor gyűjthető szemét, ha ismét tétlen IdleTimeoutInSeconds
marad. Ne feledje, hogy a rendszer úgy tekinti, hogy egy színészt akkor használtak, ha a rendszer egy színészi felületi metódust vagy egy színész emlékeztető visszahívását hajtja végre. A rendszer nem tekinti úgy, hogy a rendszer nem használta volna az időzítő visszahívását.
Az alábbi ábrán egyetlen szereplő életciklusa látható, amely szemlélteti ezeket a fogalmakat.
A példa az aktor metódushívásainak, emlékeztetőinek és időzítőinek a színész é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 értéken történik, az 5-ös 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égrehajtva. Ez nem befolyásolja a színész tétlen idejét.
- A T=7 aktor metódushívása alaphelyzetbe állítja az üresjárati időt 0-ra, és késlelteti a színész szemétgyűjtését.
- A színész emlékeztető visszahívása a T=14-nél fut, és tovább késlelteti a színész szemétgyűjtését.
- A T=25 szemétgyűjtési vizsgálat során a színész tétlenségi ideje végül meghaladja a 10 tétlenségi időtúllépést, a színész pedig a szemétgyűjtést.
A színészek soha nem lesznek szemét gyűjtve az egyik metódus végrehajtása során, 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 a színész tétlenségi idejét 0-ra állítja vissza. Az időzítővisszahívások végrehajtása nem állítja vissza az üresjárati időt 0-ra. Az aktor szemétgyűjtése azonban elhalasztva, amíg az időzítő visszahívása befejeződött.
Szereplők és állapotuk manuális törlése
Az inaktivált színészek szemétgyűjtése csak az aktorobjektumot tisztítja meg, de nem távolítja el azokat az adatokat, amelyeket egy színész State Managerében tárol. Amikor egy szereplő újra aktiválódik, az adatai ismét elérhetővé válnak 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 szereplők törlésére, a törlési szereplők és állapotuk olvasására.