Megbízható szolgáltatások életciklusának áttekintése
Amikor az Azure Service Fabric Reliable Services életciklusára gondol, az életciklus alapjai a legfontosabbak. Az életciklus általában a következőket tartalmazza:
- Indításkor:
- A szolgáltatások létre lettek építve.
- A szolgáltatásoknak lehetőségük van nulla vagy több figyelő létrehozására és visszaadására.
- A visszaadott figyelők megnyílnak, lehetővé téve a szolgáltatással való kommunikációt.
- A rendszer meghívja a szolgáltatás RunAsync metódusát, amely lehetővé teszi, hogy a szolgáltatás hosszú ideig futó feladatokat vagy háttérmunkát végez.
- Leállítás során:
- A RunAsyncnek átadott lemondási jogkivonat megszakad, és a figyelők le lesznek zárva.
- A figyelők bezárása után maga a szolgáltatásobjektum is megszűnik.
Az események pontos sorrendje körül vannak részletek. Az események sorrendje kissé változhat attól függően, hogy a Reliable Service állapot nélküli vagy állapotalapú. Emellett az állapotalapú szolgáltatások esetében az elsődleges felcserélési forgatókönyvvel kell foglalkoznunk. Ebben a sorozatban az elsődleges szerepkör átkerül egy másik replikába (vagy visszatér), a szolgáltatás leállítása nélkül. Végül gondolnunk kell a hibákra vagy a hibákra.
Állapot nélküli szolgáltatás indítása
Az állapot nélküli szolgáltatások életciklusa egyszerű. Az események sorrendje a következő:
- A szolgáltatás létre van építve.
StatelessService.CreateServiceInstanceListeners()
a rendszer meghívja, és minden visszaadott figyelő megnyílik.ICommunicationListener.OpenAsync()
minden figyelőn meghívja.- Aztán, párhuzamosan, két dolog történik -
- A szolgáltatás metódusának meghívása
StatelessService.RunAsync()
. - Ha van ilyen, a szolgáltatás metódusának meghívása
StatelessService.OnOpenAsync()
történik. Ez a hívás nem gyakori felülbírálás, de elérhető. A kiterjesztett szolgáltatás inicializálási feladatai jelenleg elindíthatók.
- A szolgáltatás metódusának meghívása
Állapot nélküli szolgáltatás leállítása
Az állapot nélküli szolgáltatások leállításához ugyanazt a mintát követi a rendszer, csak fordított sorrendben:
- A nyitott figyelők zárva vannak.
ICommunicationListener.CloseAsync()
minden figyelőn meghívja. - Az átadott
RunAsync()
lemondási jogkivonat le lesz mondva. A lemondási jogkivonat tulajdonságánakIsCancellationRequested
ellenőrzése igaz értéket ad vissza, és ha meghívják, a jogkivonat metódusaThrowIfCancellationRequested
egyOperationCanceledException
. A Service Fabric megvárja aRunAsync()
befejezést. - A befejezés után
RunAsync()
a szolgáltatás metódusának meghívásaStatelessService.OnCloseAsync()
történik, ha van ilyen. Az OnCloseAsync akkor lesz meghívva, ha az állapot nélküli szolgáltatáspéldány kecsesen le lesz állítva. Ez akkor fordulhat elő, ha a szolgáltatás kódját frissítik, a szolgáltatáspéldányt terheléselosztás miatt áthelyezik, vagy átmeneti hibát észlelnek. Nem gyakori a felülbírálásStatelessService.OnCloseAsync()
, de használható az erőforrások biztonságos bezárására, a háttérfeldolgozás leállítására, a külső állapot mentésének befejezésére vagy a meglévő kapcsolatok bezárására. - A befejezés után
StatelessService.OnCloseAsync()
a szolgáltatásobjektum fel lesz bontva.
Állapotalapú szolgáltatás indítása
Az állapotalapú szolgáltatások mintázata az állapot nélküli szolgáltatásokhoz hasonló, néhány módosítással. Állapotalapú szolgáltatás indításához az események sorrendje a következő:
A szolgáltatás létre van építve.
StatefulServiceBase.OnOpenAsync()
meghívva. Ez a hívás általában nem felül van bírálva a szolgáltatásban.StatefulServiceBase.CreateServiceReplicaListeners()
meghívásra kerül.- Ha a szolgáltatás elsődleges szolgáltatás, az összes visszaadott figyelő megnyílik.
ICommunicationListener.OpenAsync()
minden figyelőn meghívja. - Ha a szolgáltatás másodlagos szolgáltatás, akkor csak azok a figyelők nyílnak meg, akik megjelöltek.
ListenOnSecondary = true
A másodfokon megnyitott figyelők kevésbé gyakoriak.
- Ha a szolgáltatás elsődleges szolgáltatás, az összes visszaadott figyelő megnyílik.
Ezután párhuzamosan:
- Ha a szolgáltatás jelenleg elsődleges, a szolgáltatás metódusának meghívása
StatefulServiceBase.RunAsync()
történik. StatefulServiceBase.OnChangeRoleAsync()
meghívva. Ez a hívás általában nem felül van bírálva a szolgáltatásban.
Feljegyzés
Egy új másodlagos replika
StatefulServiceBase.OnChangeRoleAsync()
esetében a rendszer kétszer hívja meg. A 2. lépés után egyszer, amikor inaktív másodlagossá válik, majd a 4. lépésben, amikor aktív másodlagossá válik. A replikával és a példány életciklusával kapcsolatos további információkért olvassa el a replika és a példány életciklusát.- Ha a szolgáltatás jelenleg elsődleges, a szolgáltatás metódusának meghívása
Állapotalapú szolgáltatás leállítása
Az állapot nélküli szolgáltatásokhoz hasonlóan a leállítás alatti életciklus-események is ugyanazok, mint az indításkor, de fordítottak. Állapotalapú szolgáltatás leállítása esetén a következő események következnek be:
A nyitott figyelők zárva vannak.
ICommunicationListener.CloseAsync()
minden figyelőn meghívja.StatefulServiceBase.OnCloseAsync()
metódus meghívása. Ez a hívás nem gyakori felülbírálás, de elérhető.Az átadott
RunAsync()
lemondási jogkivonat le lesz mondva. A lemondási jogkivonat tulajdonságánakIsCancellationRequested
ellenőrzése igaz értéket ad vissza, és ha meghívják, a jogkivonat metódusaThrowIfCancellationRequested
egyOperationCanceledException
. A Service Fabric megvárja aRunAsync()
befejezést.Feljegyzés
A RunAsync befejezésére csak akkor van szükség, ha ez a replika elsődleges replika.
A befejezés után
StatefulServiceBase.RunAsync()
a szolgáltatásobjektum fel lesz bontva.
Állapotalapú szolgáltatás elsődleges felcserélése
Miközben egy állapotalapú szolgáltatás fut, csak az állapotalapú szolgáltatások elsődleges replikái nyitották meg a kommunikációs figyelőket, és meghívták a RunAsync metódust. A másodlagos replikák létre lettek állítva, de nem látnak további hívásokat. Miközben egy állapotalapú szolgáltatás fut, az elsődleges replika a hiba vagy a fürtelosztás optimalizálása miatt változhat. Mit jelent ez a replika által látható életciklus-események szempontjából? Az állapotalapú replika viselkedése attól függ, hogy lefokozzák vagy előléptetik-e a replikát a felcserélés során.
A lefokozott elsődleges esetében
A lefokozott elsődleges replika esetében a Service Fabricnek szüksége van erre a replikára, hogy leállítja az üzenetek feldolgozását, és kilépjen az általa végzett háttérmunkákból. Ennek eredményeképpen ez a lépés úgy néz ki, mint a szolgáltatás leállásakor. Az egyik különbség az, hogy a szolgáltatás nem destrukált vagy bezárt, mert másodlagos marad. A rendszer a következő API-kat hívja meg:
- A nyitott figyelők zárva vannak.
ICommunicationListener.CloseAsync()
minden figyelőn meghívja. - Az átadott
RunAsync()
lemondási jogkivonat le lesz mondva. A lemondási jogkivonat tulajdonságánakIsCancellationRequested
ellenőrzése igaz értéket ad vissza, és ha meghívják, a jogkivonat metódusaThrowIfCancellationRequested
egyOperationCanceledException
. A Service Fabric megvárja aRunAsync()
befejezést. - A ListenOnSecondary = true értékként megjelölt figyelők meg vannak nyitva.
- A szolgáltatás
StatefulServiceBase.OnChangeRoleAsync()
neve. Ez a hívás általában nem felül van bírálva a szolgáltatásban.
A másodlagos előléptetett
Hasonlóképpen, a Service Fabricnek szüksége van a másodlagos replikára, amely elő van léptetve ahhoz, hogy elkezdje figyelni a vezetéken lévő üzeneteket, és elindítsa a szükséges háttérfeladatokat. Ennek eredményeképpen ez a folyamat úgy néz ki, mint a szolgáltatás létrehozásakor, kivéve, hogy maga a replika már létezik. A rendszer a következő API-kat hívja meg:
ICommunicationListener.CloseAsync()
a rendszer az összes megnyitott figyelőhöz meghívja (a ListenOnSecondary = true jelöléssel van megjelölve).- Minden kommunikációs figyelő meg van nyitva.
ICommunicationListener.OpenAsync()
minden figyelőn meghívja. - Ezután párhuzamosan:
- A szolgáltatás metódusának meghívása
StatefulServiceBase.RunAsync()
. StatefulServiceBase.OnChangeRoleAsync()
meghívva. Ez a hívás általában nem felül van bírálva a szolgáltatásban.
- A szolgáltatás metódusának meghívása
Feljegyzés
CreateServiceReplicaListeners
a rendszer csak egyszer hívja meg, és nem hívja meg újra a replika előléptetése vagy lefokozása során; ugyanazokat ServiceReplicaListener
a példányokat használja a rendszer, de az előző példányok bezárása után új ICommunicationListener
példányok jönnek létre (a ServiceReplicaListener.CreateCommunicationListener
metódus meghívásával).
Gyakori problémák az állapotalapú szolgáltatás leállítása és az elsődleges lefokozás során
A Service Fabric számos okból módosítja egy állapotalapú szolgáltatás elsődleges szolgáltatását. A leggyakoribbak a fürtök újraegyensúlyozása és az alkalmazások frissítése. Ezen műveletek során (valamint a normál szolgáltatásleállítás során, például a szolgáltatás törlésekor) fontos, hogy a szolgáltatás tiszteletben tartsa a CancellationToken
.
Azok a szolgáltatások, amelyek nem kezelik tisztán a lemondást, számos problémát tapasztalhatnak. Ezek a műveletek lassúak, mert a Service Fabric megvárja, amíg a szolgáltatások kecsesen leállnak. Ez végső soron a sikertelen frissítésekhez vezethet, amelyek időtúllépést okoznak, és visszaválthatnak. A lemondási jogkivonat be nem tartása kiegyensúlyozatlan fürtöket is okozhat. A fürtök kiegyensúlyozatlanná válnak, mert a csomópontok felforrósodnak, de a szolgáltatások nem egyensúlyozhatók újra, mert túl sokáig tart máshová áthelyezni őket.
Mivel a szolgáltatások állapotalapúak, valószínű, hogy a Reliable Collections szolgáltatást használják. A Service Fabricben az elsődleges lefokozásakor az egyik első dolog, hogy visszavonják az alapul szolgáló állapot írási hozzáférését. Ez a szolgáltatás életciklusát befolyásoló problémák második csoportjához vezet. A gyűjtemények kivételeket adnak vissza az időzítés és a replika áthelyezése vagy leállítása alapján. Ezeket a kivételeket helyesen kell kezelni. A Service Fabric által kidobott kivételek állandó (FabricException
) és átmeneti (FabricTransientException
) kategóriákba sorolhatók. Az állandó kivételeket naplózni és dobni kell, míg az átmeneti kivételeket újra lehet próbálkozni egy újrapróbálkozási logika alapján.
A megbízható szolgáltatás tesztelésének és érvényesítésének fontos része a ReliableCollections
szolgáltatás életciklus-eseményekkel együtt történő használatából eredő kivételek kezelése. Javasoljuk, hogy az éles üzembe helyezés előtt mindig a terhelés alatt futtassa a szolgáltatást a frissítések és a káosz tesztelése során. Ezek az alapvető lépések segítenek biztosítani, hogy a szolgáltatás megfelelően implementálva legyen, és megfelelően kezelje az életciklus-eseményeket.
Megjegyzések a szolgáltatás életciklusáról
RunAsync()
A metódus és aCreateServiceReplicaListeners/CreateServiceInstanceListeners
hívások nem kötelezőek. Egy szolgáltatáshoz tartozhat mindkettő, vagy egyik sem. Ha például a szolgáltatás minden munkáját a felhasználói hívásokra válaszul végzi, nincs szükség a implementálásraRunAsync()
. Csak a kommunikációs figyelőkre és a hozzájuk tartozó kódra van szükség. Hasonlóképpen a kommunikációs figyelők létrehozása és visszaadása nem kötelező, mivel a szolgáltatásnak csak háttérmunkával kell rendelkeznie, ezért csak implementálniaRunAsync()
kell.- Érvényes, hogy egy szolgáltatás sikeresen befejeződik
RunAsync()
, és visszatér onnan. A befejezés nem hibafeltétel. A befejezésRunAsync()
azt jelzi, hogy a szolgáltatás háttérmunka befejeződött. Állapotalapú megbízható szolgáltatások esetén a rendszer újra meghívja,RunAsync()
ha a replikát lefokozták az elsődlegesről a másodlagosra, majd előléptetik az elsődlegesre. - Ha egy szolgáltatás váratlan kivétellel lép ki a rendszerből
RunAsync()
, az hibát jelent. A szolgáltatásobjektum le van állítva, és állapothiba jelenik meg. - Bár ezekből a módszerekből nincs időkorlát, azonnal elveszíti a megbízható gyűjteményekbe való írás képességét, ezért nem tud valódi munkát végezni. Javasoljuk, hogy a lemondási kérelem beérkezésekor a lehető leggyorsabban térjen vissza. Ha a szolgáltatás ésszerű időn belül nem válaszol ezekre az API-hívásokra, a Service Fabric kényszerítve megszüntetheti a szolgáltatást. Ez általában csak az alkalmazásfrissítések vagy egy szolgáltatás törlése során történik. Ez az időkorlát alapértelmezés szerint 15 perc.
- Az elérési út hibáinak
OnCloseAsync()
meghívásaOnAbort()
az utolsó esély arra, hogy a szolgáltatás megtisztítsa és felszabadítsa az általuk igényelt erőforrásokat. Ezt általában akkor hívják, ha a csomóponton állandó hiba észlelhető, vagy ha a Service Fabric belső hibák miatt nem tudja megbízhatóan kezelni a szolgáltatáspéldány életciklusát. OnChangeRoleAsync()
a rendszer akkor hívja meg, ha az állapotalapú szolgáltatásreplika szerepkört módosít, például elsődleges vagy másodlagos. Az elsődleges replikák írási állapotot kapnak (a megbízható gyűjtemények létrehozása és írása engedélyezett). A másodlagos replikák olvasási állapotban vannak (csak meglévő megbízható gyűjteményekből olvashatók). Az állapotalapú szolgáltatásban a legtöbb munka az elsődleges replikán történik. A másodlagos replikák írásvédett ellenőrzést, jelentéskészítést, adatbányászatot vagy más írásvédett feladatokat is végrehajthatnak.