Přehled životního cyklu reliable services
Když přemýšlíte o životních cyklech Azure Service Fabric Reliable Services, nejdůležitější jsou základy životního cyklu. Obecně platí, že životní cyklus zahrnuje následující:
- Během spouštění:
- Služby jsou vytvořeny.
- Služby mají možnost vytvořit a vrátit nula nebo více naslouchacích procesů.
- Všechny vrácené naslouchací procesy jsou otevřeny a umožňují komunikaci se službou.
- Volá se metoda RunAsync služby, což službě umožňuje provádět dlouhotrvající úlohy nebo práci na pozadí.
- Během vypnutí:
- Token zrušení předaný runAsync se zruší a naslouchací procesy se zavře.
- Po zavření naslouchacích procesů se destruuje samotný objekt služby.
Existují podrobnosti o přesném pořadí těchto událostí. Pořadí událostí se může mírně změnit v závislosti na tom, jestli je Spolehlivá služba bezstavová nebo stavová. U stavových služeb se navíc musíme zabývat scénářem primárního prohození. Během této sekvence se role Primární přenese na jinou repliku (nebo se vrátí zpět) bez vypnutí služby. Nakonec musíme uvažovat o chybách nebo selháních.
Spuštění bezstavové služby
Životní cyklus bezstavové služby je jednoduchý. Toto je pořadí událostí:
- Služba je vytvořena.
StatelessService.CreateServiceInstanceListeners()
se vyvolá a všechny vrácené naslouchací procesy se otevřou.ICommunicationListener.OpenAsync()
se volá v každém naslouchacím procesu.- Pak se paralelně stanou dvě věci :
- Volá se
StatelessService.RunAsync()
metoda služby. - Pokud je k dispozici, volá se
StatelessService.OnOpenAsync()
metoda služby. Toto volání je neobvyklé přepsání, ale je k dispozici. V tuto chvíli je možné spustit úlohy rozšířené inicializace služby.
- Volá se
Vypnutí bezstavové služby
Při vypnutí bezstavové služby se postupuje stejně, jen obráceně:
- Všechny otevřené naslouchací procesy jsou zavřené.
ICommunicationListener.CloseAsync()
se volá v každém naslouchacím procesu. - Token zrušení předaný do
RunAsync()
se zruší. Kontrola vlastnosti tokenuIsCancellationRequested
zrušení vrátí hodnotu true, a pokud je volána, metoda tokenuThrowIfCancellationRequested
vyvoláOperationCanceledException
. Service Fabric čekáRunAsync()
na dokončení. - Po
RunAsync()
dokončení se volá metoda službyStatelessService.OnCloseAsync()
, pokud je k dispozici. OnCloseAsync se volá, když se bezstavová instance služby řádně vypne. K tomu může dojít při upgradu kódu služby, přesunu instance služby kvůli vyrovnávání zatížení nebo zjištění přechodné chyby. PřepsáníStatelessService.OnCloseAsync()
je neobvyklé, ale dá se použít k bezpečnému zavření prostředků, zastavení zpracování na pozadí, dokončení ukládání externího stavu nebo ukončení existujících připojení. - Po
StatelessService.OnCloseAsync()
dokončení je objekt služby destrukován.
Stavové spuštění služby
Stavové služby mají podobný vzor jako bezstavové služby s několika změnami. Pro spuštění stavové služby je pořadí událostí následující:
Služba je vytvořena.
Volá se
StatefulServiceBase.OnOpenAsync()
. Toto volání není ve službě běžně přepsáno.StatefulServiceBase.CreateServiceReplicaListeners()
je vyvolána.- Pokud je služba primární službou, otevřou se všechny vrácené naslouchací procesy.
ICommunicationListener.OpenAsync()
se volá v každém naslouchacím procesu. - Pokud je služba sekundární službou, otevřou se pouze naslouchací procesy označené jako
ListenOnSecondary = true
. Méně časté je mít naslouchací procesy, které jsou otevřené ve sekundárních souborech.
- Pokud je služba primární službou, otevřou se všechny vrácené naslouchací procesy.
Pak paralelně:
- Pokud je služba aktuálně primární, volá se
StatefulServiceBase.RunAsync()
metoda služby. - Volá se
StatefulServiceBase.OnChangeRoleAsync()
. Toto volání není ve službě běžně přepsáno.
Poznámka
Pro novou sekundární repliku
StatefulServiceBase.OnChangeRoleAsync()
je volána dvakrát. Jednou po kroku 2, když se stane nečinnou sekundární, a znovu během kroku 4, když se stane aktivní sekundární. Další informace o životním cyklu repliky a instance najdete v tématu Životní cyklus repliky a instance.- Pokud je služba aktuálně primární, volá se
Vypnutí stavové služby
Stejně jako bezstavové služby jsou události životního cyklu během vypnutí stejné jako při spuštění, ale obráceně. Při vypnutí stavové služby dojde k následujícím událostem:
Všechny otevřené naslouchací procesy jsou zavřené.
ICommunicationListener.CloseAsync()
se volá v každém naslouchacím procesu.StatefulServiceBase.OnCloseAsync()
je volána metoda. Toto volání je neobvyklé přepsání, ale je k dispozici.Token zrušení předaný do
RunAsync()
se zruší. Kontrola vlastnosti tokenuIsCancellationRequested
zrušení vrátí hodnotu true, a pokud je volána, metoda tokenuThrowIfCancellationRequested
vyvoláOperationCanceledException
. Service Fabric čekáRunAsync()
na dokončení.Poznámka
Potřeba počkat na dokončení runAsync je nutné pouze v případě, že je tato replika primární replikou.
Po
StatefulServiceBase.RunAsync()
dokončení je objekt služby destrukován.
Primární swapy stavové služby
Zatímco je stavová služba spuštěná, pouze primární repliky těchto stavových služeb mají otevřené komunikační naslouchací procesy a volána metoda RunAsync . Sekundární repliky jsou vytvořené, ale nezobrazují se žádná další volání. Když je stavová služba spuštěná, replika, která je aktuálně primární, se může změnit v důsledku optimalizace selhání nebo vyrovnávání clusteru. Co to znamená z hlediska událostí životního cyklu, které může replika zobrazit? Chování stavové repliky závisí na tom, jestli je replika během prohození degradována nebo povýšena.
Pro primární, která je degradovaná
V případě primární repliky, která je degradovaná, potřebuje Service Fabric tuto repliku, aby zastavila zpracování zpráv a ukončila veškerou práci na pozadí, kterou provádí. V důsledku toho tento krok vypadá stejně jako při vypnutí služby. Jedním z rozdílů je, že služba není destrukovaná nebo uzavřená, protože zůstává jako sekundární. Volají se následující rozhraní API:
- Všechny otevřené naslouchací procesy jsou zavřené.
ICommunicationListener.CloseAsync()
se volá v každém naslouchacím procesu. - Token zrušení předaný do
RunAsync()
se zruší. Kontrola vlastnosti tokenuIsCancellationRequested
zrušení vrátí hodnotu true, a pokud je volána, metoda tokenuThrowIfCancellationRequested
vyvoláOperationCanceledException
. Service Fabric čekáRunAsync()
na dokončení. - Naslouchací procesy označené jako ListenOnSecondary = true se otevřou.
- Služba je
StatefulServiceBase.OnChangeRoleAsync()
volána. Toto volání není ve službě běžně přepsáno.
Pro sekundární, která je povýšená
Podobně Service Fabric potřebuje sekundární repliku, která je povýšená, aby začala naslouchat zprávm v přenosu a spouštět všechny úlohy na pozadí, které je potřeba dokončit. V důsledku toho tento proces vypadá stejně jako při vytvoření služby s tím rozdílem, že samotná replika už existuje. Volají se následující rozhraní API:
ICommunicationListener.CloseAsync()
se volá pro všechny otevřené naslouchací procesy (označené ListenOnSecondary = true).- Všechny komunikační naslouchací procesy jsou otevřeny.
ICommunicationListener.OpenAsync()
se volá v každém naslouchacím procesu. - Pak paralelně:
- Volá se
StatefulServiceBase.RunAsync()
metoda služby. - Volá se
StatefulServiceBase.OnChangeRoleAsync()
. Toto volání není ve službě často přepsáno.
- Volá se
Poznámka
CreateServiceReplicaListeners
je volána pouze jednou a není volána znovu během procesu povýšení nebo degradace repliky; používají se stejné ServiceReplicaListener
instance, ale nové ICommunicationListener
instance jsou vytvořeny (voláním ServiceReplicaListener.CreateCommunicationListener
metody) po zavření předchozích instancí.
Běžné problémy při vypínání stavové služby a degradaci primárních dat
Service Fabric změní primární stavovou službu z různých důvodů. Mezi nejběžnější patří vyrovnávání clusteru a upgrade aplikací. Během těchto operací (stejně jako během normálního vypnutí služby, například při odstranění služby) je důležité, aby služba respektovala CancellationToken
.
U služeb, které zrušení nezpracují čistě, může docházet k několika problémům. Tyto operace jsou pomalé, protože Service Fabric čeká na řádné zastavení služeb. To může nakonec vést k neúspěšné upgrady, které vyprší a vrátí se zpět. Selhání při nedodržení tokenu zrušení může také způsobit nevyváženost clusterů. Clustery se přestanou vyrovnávat, protože uzly jsou horké, ale služby se nedají znovu vyvážit, protože jejich přesun jinam trvá příliš dlouho.
Vzhledem k tomu, že služby jsou stavové, je také pravděpodobné, že používají Reliable Collections. Když se v Service Fabric sníží úroveň primárního objektu, jednou z prvních věcí, která se stane, je odvolání přístupu pro zápis do základního stavu. To vede k druhé sadě problémů, které můžou ovlivnit životní cyklus služby. Kolekce vrací výjimky na základě časování a toho, jestli se replika přesouvá nebo vypíná. Tyto výjimky by měly být zpracovány správně. Výjimky vyvolané Service Fabricem spadají do trvalých (FabricException
) a přechodných (FabricTransientException
) kategorií. Trvalé výjimky by se měly protokolovat a vyvolat, zatímco přechodné výjimky je možné opakovat na základě určité logiky opakování.
Zpracování výjimek, které pocházejí z použití ReliableCollections
služby ve spojení s událostmi životního cyklu služby, je důležitou součástí testování a ověřování Reliable Service. Před nasazením do produkčního prostředí doporučujeme službu vždy spouštět pod zatížením při provádění upgradů a testování chaosu . Tyto základní kroky pomáhají zajistit správnou implementaci vaší služby a správné zpracování událostí životního cyklu.
Poznámky k životnímu cyklu služby
RunAsync()
Metoda iCreateServiceReplicaListeners/CreateServiceInstanceListeners
volání jsou volitelné. Služba může mít jednu z nich, obě nebo ani jedno. Pokud například služba provádí veškerou svou práci v reakci na volání uživatelů, není nutné implementovatRunAsync()
. Jsou nutné pouze naslouchací procesy komunikace a jejich přidružený kód. Podobně je vytváření a vracení komunikačních naslouchacích procesů volitelné, protože služba může provádět pouze práci na pozadí, a proto stačí implementovatRunAsync()
pouze .- Je platné, aby se služba úspěšně dokončila
RunAsync()
a vrátila se z ní. Dokončení není podmínkou selhání. DokončeníRunAsync()
znamená, že práce služby na pozadí byla dokončena. Pro stavové spolehlivé služby se volá znovu,RunAsync()
pokud je replika degradována z primární na sekundární a pak povýšena zpět na primární. - Pokud se služba ukončí
RunAsync()
vyvoláním neočekávané výjimky, jedná se o selhání. Objekt služby se vypne a nahlásí se chyba stavu. - I když neexistuje žádný časový limit pro návrat z těchto metod, okamžitě ztratíte schopnost zapisovat do Reliable Collections, a proto nelze dokončit žádnou skutečnou práci. Doporučujeme, abyste se po přijetí žádosti o zrušení vrátili co nejrychleji. Pokud vaše služba nereaguje na tato volání rozhraní API v přiměřeném čase, service Fabric může službu vynutit ukončením. Obvykle k tomu dochází pouze během upgradů aplikací nebo při odstranění služby. Tento časový limit je ve výchozím nastavení 15 minut.
- Selhání v
OnCloseAsync()
cestě mají zaOnAbort()
následek zavolání, což je poslední příležitost k tomu, aby služba vyčistili a uvolnili všechny prostředky, které si nárokovala. To se obvykle nazývá, když se na uzlu zjistí trvalá chyba nebo když Service Fabric nemůže spolehlivě spravovat životní cyklus instance služby kvůli interním selháním. OnChangeRoleAsync()
se volá, když replika stavové služby mění roli, například na primární nebo sekundární. Primární repliky mají stav zápisu (můžou vytvářet a zapisovat do reliable collections). Sekundární repliky mají stav čtení (můžou číst jenom z existujících spolehlivých kolekcí). Většina práce ve stavové službě se provádí v primární replice. Sekundární repliky můžou provádět ověřování jen pro čtení, generování sestav, dolování dat nebo jiné úlohy jen pro čtení.