Životní cyklus Reliable Services
Reliable Services je jedním z programovacích modelů dostupných v Azure Service Fabric. Když se seznámíte s životním cyklem Reliable Services, je nejdůležitější pochopit základní události životního cyklu. Přesné řazení událostí závisí na podrobnostech konfigurace.
Životní cyklus Reliable Services obecně zahrnuje následující události:
- Během spouštění:
- Služby se vytvářejí.
- Služby mají příležitost vytvářet a vracet nulové nebo více naslouchacích procesů.
- Všechny vrácené naslouchací procesy se otevřou pro komunikaci se službou.
- Volá se
runAsync
metoda služby, aby služba fungovala dlouhou dobu nebo na pozadí.
- Během vypnutí:
- Token zrušení, kterému
runAsync
byl předán, se zruší a naslouchací procesy se zavře. - Samotný objekt služby je destrukován.
- Token zrušení, kterému
Pořadí událostí v Reliable Services 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 je také nutné řešit primární scénář prohození. Během této sekvence se role primárního serveru přenese do jiné repliky (nebo se vrátí) bez vypnutí služby.
Nakonec se musíte zamyslet nad chybovými nebo chybovými podmínkami.
Spuštění bezstavové služby
Životní cyklus bezstavové služby je poměrně jednoduchý. Tady je pořadí událostí:
- Služba se sestaví.
StatelessService.createServiceInstanceListeners()
je vyvolána a všechny vrácené naslouchací procesy jsou otevřeny.CommunicationListener.openAsync()
je volána na každém naslouchacím procesu.- Pak paralelně:
- Volá se
runAsync
metoda služby (StatelessService.runAsync()
). - Pokud je k dispozici, volá se vlastní
onOpenAsync
metoda služby. Konkrétně seStatelessService.onOpenAsync()
volá. Toto je neobvyklé přepsání, ale je k dispozici.
- Volá se
Vypnutí bezstavové služby
Při vypnutí bezstavové služby se postupuje stejně, ale obráceně:
- Všechny otevřené naslouchací procesy jsou zavřené.
CommunicationListener.closeAsync()
je volána na každém naslouchacím procesu. - Token zrušení, kterému
runAsync()
byl předán, se zruší. Kontrola vlastnosti tokenuisCancelled
zrušení vrátítrue
a pokud je volána, metoda tokenuthrowIfCancellationRequested
CancellationException
vyvolá chybu . - Po
runAsync()
dokončení se volá metoda službyStatelessService.onCloseAsync()
, pokud je k dispozici. Toto není běžné přepsání, ale lze ho použít k bezpečnému zavření prostředků, zastavení zpracování na pozadí, dokončení ukládání externího stavu nebo zavření existujících připojení. - Po
StatelessService.onCloseAsync()
dokončení se objekt služby destrukuje.
Spuštění stavové služby
Stavové služby mají vzor podobný bezstavovým službám s několika změnami. Tady je pořadí událostí pro spuštění stavové služby:
- Služba se sestaví.
- Volá se
StatefulServiceBase.onOpenAsync()
. Toto volání se ve službě obvykle nepřepíše. StatefulServiceBase.createServiceReplicaListeners()
je vyvolána.- Pokud je služba primární službou, otevřou se všechny vrácené naslouchací procesy.
CommunicationListener.openAsync()
je volána na každém naslouchacím procesu. - Pokud je služba sekundární službou, otevřou se jenom naslouchací procesy označené jako
listenOnSecondary = true
otevřené. Naslouchací procesy, které jsou otevřené u sekundárních souborů, jsou méně časté.
- 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 metoda služby
StatefulServiceBase.runAsync()
. - Volá se
StatefulServiceBase.onChangeRoleAsync()
. Toto volání se ve službě obvykle nepřepíše.
- Pokud je služba aktuálně primární, volá se metoda služby
Poznámka:
Pro novou sekundární repliku se StatefulServiceBase.onChangeRoleAsync()
volá dvakrát. Jakmile po kroku 2 se stane nečinným sekundárním 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 Replika a Životní cyklus instance.
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ě. Když je stavová služba vypnutá, dojde k následujícím událostem:
- Všechny otevřené naslouchací procesy jsou zavřené.
CommunicationListener.closeAsync()
je volána na každém naslouchacím procesu. - Token zrušení, kterému
runAsync()
byl předán, se zruší. Volání metody zrušení tokenuisCancelled()
vrátítrue
a pokud je volána, metoda tokenuthrowIfCancellationRequested()
vyvoláOperationCanceledException
. Service Fabric čeká narunAsync()
dokončení.
Poznámka:
Čekání na runAsync
dokončení je nezbytné pouze v případě, že je tato replika primární replikou.
- Po
runAsync()
dokončení se volá metoda službyStatefulServiceBase.onCloseAsync()
. Toto volání je neobvyklé přepsání, ale je k dispozici. - Po
StatefulServiceBase.onCloseAsync()
dokončení se objekt služby destrukuje.
Primární prohození stavových služeb
Zatímco je spuštěna stavová služba, komunikační naslouchací procesy se otevřou a runAsync
metoda se volá pouze pro primární repliky těchto stavových služeb. Sekundární repliky jsou vytvořené, ale nezobrazují se žádná další volání. Zatímco je spuštěná stavová služba, replika, která je aktuálně primární, se může změnit. Události životního cyklu, které může zobrazit stavová replika, závisí na tom, jestli se jedná o degradovanou nebo povýšenou repliku během prohození.
U degradovaného primárního serveru
Service Fabric potřebuje primární repliku, která je degradovaná, aby zastavila zpracování zpráv a zastavila veškerou práci na pozadí. Tento krok je podobný, jako když je služba vypnutá. Jedním z rozdílů je, že služba není destrukovaná nebo uzavřená, protože zůstává jako sekundární. Dojde k následujícím událostem:
- Všechny otevřené naslouchací procesy jsou zavřené.
CommunicationListener.closeAsync()
je volána na každém naslouchacím procesu. - Token zrušení, kterému
runAsync()
byl předán, se zruší. Kontrola metody zrušení tokenuisCancelled()
vrátítrue
. Pokud je volána, metoda tokenuthrowIfCancellationRequested()
vyvolá .OperationCanceledException
Service Fabric čeká narunAsync()
dokončení. - Naslouchací procesy označené jako listenOnSecondary = true se otevřou.
StatefulServiceBase.onChangeRoleAsync()
Služba je volána. Toto volání se ve službě obvykle nepřepíše.
Pro upřednostněnou sekundární
Podobně Service Fabric potřebuje sekundární repliku, která je povýšená, aby začala naslouchat zprávům v přenosu a spouštět všechny úlohy na pozadí, které potřebuje dokončit. Tento proces se podobá vytvoření služby. Rozdíl je v tom, že replika už existuje. Dojde k následujícím událostem:
CommunicationListener.closeAsync()
je volána pro všechny otevřené naslouchací procesy (označeno jako listenOnSecondary = true)- Všechny naslouchací procesy komunikace jsou otevřeny.
CommunicationListener.openAsync()
je volána na každém naslouchacím procesu. - Pak paralelně:
- Volá se
StatefulServiceBase.runAsync()
metoda služby. - Volá se
StatefulServiceBase.onChangeRoleAsync()
. Toto volání se ve službě obvykle nepřepíše.
- Volá se
Poznámka:
createServiceReplicaListeners
je volána pouze jednou a není volána znovu během procesu povýšení nebo snížení úrovně repliky; Používají se stejné ServiceReplicaListener
instance, ale po zavření předchozích instancí se vytvoří nové CommunicationListener
instance (voláním ServiceReplicaListener.createCommunicationListener
metody).
Běžné problémy s vypnutím stavové služby a primárním snížením úrovně
Service Fabric změní primární stavovou službu z několika důvodů. Nejběžnějšími důvody jsou obnovení rovnováhy clusteru a upgrade aplikací. Během těchto operací je důležité, aby služba respektovala cancellationToken
. To platí i během normálního vypnutí služby, například pokud byla služba odstraněna.
U služeb, které nezachází s čistým zrušením, 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 selhání upgradů, které vyprší časový limit a vrácení zpět. Pokud se token zrušení nedotknou, může to způsobit nevyvážené clustery. Clustery se stanou nevyvážené, protože uzly jsou horké. Služby ale není možné znovu vyvážit, protože jejich přesun na jiné místo trvá příliš dlouho.
Vzhledem k tomu, že jsou služby stavové, je také pravděpodobné, že služby používají Reliable Collections. Když v Service Fabric dojde ke snížení úrovně primárního serveru, je jednou z prvních věcí, ke kterým dojde, že přístup k zápisu do základního stavu je odvolán. To vede k druhé sadě problémů, které by mohly ovlivnit životní cyklus služby. Kolekce vrací výjimky na základě načasování a toho, jestli se replika přesouvá nebo vypíná. Tyto výjimky je důležité správně zpracovat.
Výjimky vyvolané Service Fabric jsou buď trvalé (FabricException
) nebo přechodné (FabricTransientException
). Trvalé výjimky by se měly protokolovat a vyvolat. Přechodné výjimky je možné opakovat na základě logiky opakování.
Důležitou součástí testování a ověřování Reliable Services je zpracování výjimek, které pocházejí z používání ReliableCollections
ve spojení s událostmi životního cyklu služby. Doporučujeme vždy spouštět službu pod zatížením. Před nasazením do produkčního prostředí byste také měli provést upgrady a chaosové testování . Tyto základní kroky pomáhají zajistit, aby byla vaše služba správně implementována a aby správně zpracovávala události životního cyklu.
Poznámky k životnímu cyklu služby
runAsync()
Metoda icreateServiceInstanceListeners/createServiceReplicaListeners
volání jsou volitelné. Služba může mít jednu, 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é ji implementovatrunAsync()
. Nezbytné jsou pouze naslouchací procesy komunikace a jejich přidružený kód. Podobně je vytváření a vracení komunikačních naslouchacích procesů volitelné. Služba může mít pouze práci na pozadí, takže musí implementovatrunAsync()
pouze .- Služba je platná, aby se služba úspěšně dokončila
runAsync()
a vrátila se z ní. To se nepovažuje za podmínku selhání. Představuje práci na pozadí dokončení služby. U stavových spolehlivých služeb by se znovu volala,runAsync()
pokud je služba degradována z primárního serveru a pak se upřednostní zpět na primární. - Pokud se služba ukončí
runAsync()
vyvoláním nějaké neočekávané výjimky, jedná se o selhání. Objekt služby je vypnutý a zobrazí se chyba stavu. - I když neexistuje žádný časový limit pro vrácení z těchto metod, okamžitě ztratíte schopnost psát. Proto nemůžete dokončit žádnou skutečnou práci. Doporučujeme, abyste se co nejrychleji vrátili při přijetí žádosti o zrušení. Pokud vaše služba nereaguje na tato volání rozhraní API v přiměřené době, service Fabric může službu vynutit vynuceně ukončit. K tomu obvykle 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 cestě
onCloseAsync()
způsobíonAbort()
, že se volá. Toto volání je poslední příležitostí pro službu, aby vyčistila a uvolnila všechny prostředky, které si vyžádaly. To se obvykle volá, když je na uzlu zjištěna trvalá chyba nebo když Service Fabric nedokáže spolehlivě spravovat životní cyklus instance služby kvůli interním selháním. OnChangeRoleAsync()
je volána, když replika stavové služby mění roli, například na primární nebo sekundární. Primární repliky mají stav zápisu (mohou vytvářet a zapisovat do reliable collections). Sekundární repliky mají stav čtení (mohou číst pouze z existujících spolehlivých kolekcí). Většina práce ve stavové službě se provádí na 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í.