Sdílet prostřednictvím


Přehled životního cyklu Reliable Services

Když uvažujete o životním cyklu služby Azure Service Fabric Reliable Services, nejdůležitější jsou základy životního cyklu. Životní cyklus obecně zahrnuje následující:

  • Během spouštění:
    • Služby se vytvářejí.
    • Služby mají možnost vytvářet a vracet nula nebo více posluchačů.
    • Všechny vrácené naslouchací objekty se otevřou a umožní komunikaci se službou.
    • Volá se metoda RunAsync služby, která službě umožňuje provádět dlouhotrvající úlohy nebo práci na pozadí.
  • Během vypnutí:
    • Token zrušení předaný do runAsync se zruší a naslouchací procesy se zavře.
    • Po ukončení naslouchacích procesů se samotný objekt služby zničí.

Podrobnosti o přesném řazení 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á. Kromě toho musíme u stavových služeb řešit scénář výměny primárního serveru. Během této sekvence se role Primární přenese na jinou repliku (nebo se vrátí) bez vypnutí služby. Nakonec musíme přemýšlet o chybových nebo poruchových podmínkách.

Spuštění bezstavové služby

Životní cyklus bezstavové služby je jednoduchý. Tady je pořadí událostí:

  1. Služba je sestavena.
  2. StatelessService.CreateServiceInstanceListeners() je vyvolána a všechny vrácené naslouchy se otevřou. ICommunicationListener.OpenAsync() je volána pro každého naslouchacího.
  3. Pak paralelně dochází ke dvěma věcem –
    • Volá se metoda služby StatelessService.RunAsync().
    • Pokud je služba k dispozici, volá se její metoda StatelessService.OnOpenAsync(). Toto volání je neobvyklé přebití, ale je k dispozici. Rozšířené úlohy inicializace služby lze v tuto chvíli spustit.

Vypnutí bezstavové služby

Pro vypnutí bezstavové služby se postupuje stejně, jen v opačném pořadí:

  1. Všechny otevřené naslouchátka jsou zavřené. ICommunicationListener.CloseAsync() je volána pro každého naslouchacího.
  2. Token zrušení předaný RunAsync() se zruší. Kontrola vlastnosti tokenu IsCancellationRequested zrušení vrátí hodnotu true, a pokud je volána, metoda tokenu ThrowIfCancellationRequested vyvolá OperationCanceledException. Service Fabric čeká, až RunAsync() dokončí.
  3. Po dokončení RunAsync() se, pokud je k dispozici, volá metoda služby StatelessService.OnCloseAsync(). Při řádném vypnutí instance bezstavové služby se volá OnCloseAsync. K tomu může dojít při upgradu kódu služby, přesunu instance služby z důvodu vyrovnávání zatížení nebo zjištění přechodné chyby. Přepsání je neobvyklé, ale lze jej použít k bezpečnému uzavření StatelessService.OnCloseAsync() zdrojů, zastavení zpracování na pozadí, dokončení ukládání externího stavu nebo uzavření existujících připojení.
  4. Po StatelessService.OnCloseAsync() dokončení se objekt služby destrukuje.

Spuštění stavové 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í:

  1. Služba je sestavena.

  2. StatefulServiceBase.OnOpenAsync() se volá. Toto volání se ve službě obvykle nepřepíše.

  3. StatefulServiceBase.CreateServiceReplicaListeners() je vyvolán.

    • Pokud je služba primární službou, otevřou se všichni vrácení posluchači. ICommunicationListener.OpenAsync() je volána pro každého naslouchacího.
    • Pokud je služba sekundární službou, otevřou se jenom posluchači označení jako ListenOnSecondary = true. Méně často se vyskytují posluchače, kteří jsou aktivní na sekundárních systémech.
  4. Pak paralelně:

    • Pokud je služba aktuálně primární, volá se metoda služby StatefulServiceBase.RunAsync() .
    • StatefulServiceBase.OnChangeRoleAsync() se volá. Toto volání se ve službě obvykle nepřepíše.

    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:

  1. Všechny otevřené naslouchátka jsou zavřené. ICommunicationListener.CloseAsync() je volána pro každého naslouchacího.

  2. StatefulServiceBase.OnCloseAsync() metoda je zavolána. Toto volání je neobvyklé přepsání, ale je k dispozici.

  3. Token zrušení předaný RunAsync() se zruší. Kontrola vlastnosti tokenu IsCancellationRequested zrušení vrátí hodnotu true, a pokud je volána, metoda tokenu ThrowIfCancellationRequested vyvolá OperationCanceledException. Service Fabric čeká, až RunAsync() dokončí.

    Poznámka:

    Potřeba počkat na dokončení runAsync je nutná pouze v případě, že je tato replika primární replikou.

  4. Po StatefulServiceBase.RunAsync() dokončení se objekt služby destrukuje.

Primární prohození stavové služby

Zatímco je stavová služba spuštěná, mají otevřené komunikační posluchače a volají metodu RunAsync pouze primární repliky stavových služeb. Sekundární repliky jsou vytvořené, ale nedochází k žádným dalším voláním. Zatímco je spuštěná stavová služba, replika, která je aktuálně primární, se může změnit v důsledku poruchy nebo optimalizace vyvážení clusteru. Co to znamená z hlediska událostí životního cyklu, které vidí replika? Chování, které stavová replika vnímá, závisí na tom, zda je během výměny degradována nebo povýšena.

U primárního serveru, který je degradovaný

Pro degradovanou primární repliku 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á jako když byla 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í. Volají se následující rozhraní API:

  1. Všechny otevřené naslouchátka jsou zavřené. ICommunicationListener.CloseAsync() je volána pro každého naslouchacího.
  2. Token zrušení předaný RunAsync() se zruší. Kontrola vlastnosti tokenu IsCancellationRequested zrušení vrátí hodnotu true, a pokud je volána, metoda tokenu ThrowIfCancellationRequested vyvolá OperationCanceledException. Service Fabric čeká, až RunAsync() dokončí.
  3. Naslouchací instance označené jako ListenOnSecondary = true se otevřou.
  4. Volání služby StatefulServiceBase.OnChangeRoleAsync() je provedeno. Toto volání se ve službě obvykle nepřepíše.

U sekundárního, u kterého je povýšeno

Podobně Service Fabric potřebuje sekundární repliku, která byla povýšena, aby začala naslouchat komunikaci a spouštět všechny úlohy na pozadí, které je potřeba dokončit. V důsledku toho tento proces vypadá jako při vytvoření služby, s tím rozdílem, že samotná replika již existuje. Volají se následující rozhraní API:

  1. ICommunicationListener.CloseAsync() je volána pro všechny otevřené naslouchací procesy (označeno listenOnSecondary = true).
  2. Všechny komunikační posluchače jsou otevřeny. ICommunicationListener.OpenAsync() je volána pro každého naslouchacího.
  3. Pak paralelně:
    • Volá se metoda služby StatefulServiceBase.RunAsync().
    • StatefulServiceBase.OnChangeRoleAsync() se volá. Toto volání se ve službě obvykle nepřepíše.

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é ICommunicationListener 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 různých důvodů. Nejběžnější jsou vyrovnávání clusteru a upgrade aplikací. Během těchto operací (stejně jako během normálního vypnutí služby, jako byste viděli, jestli byla služba odstraněna), je důležité, aby služba respektovala CancellationToken.

Služby, které nezpracují zrušení čistě, můžou mít několik problémů. Tyto operace jsou pomalé, protože Service Fabric čeká, až se služby řádně zastaví. To může vést k selhání upgradů, které překročí časový limit a jsou vráceny zpět. Nedodržení tokenu zrušení může také způsobit nevyvážené clustery. Clustery se stanou nevyvážené, protože uzly jsou horké, ale služby se nedají 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 používají Reliable Collections. Když je v Service Fabric primární objekt přeřazen, jedním z prvních kroků je odvolání přístupu k zápisu do příslušného stavu. To vede k druhé sadě problémů, které můžou ovlivnit životní cyklus služby. Kolekce vracejí výjimky v závislosti na čase a na tom, zda se replika přesouvá nebo vypíná. Tyto výjimky by se měly zpracovat správně. Výjimky vyvolané Service Fabric 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 ve spojení s událostmi životního cyklu služby, je důležitou součástí testování a ověřování spolehlivé služby. Doporučujeme, abyste před nasazením do produkčního prostředí vždy spustili službu pod zatížením a prováděli upgrady a chaosové testování . Tyto základní kroky vám pomůžou 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 i CreateServiceReplicaListeners/CreateServiceInstanceListeners volání jsou volitelné. Služba může mít jeden z nich, obojí nebo ani jedno. Pokud například služba provádí veškerou svou práci v reakci na volání uživatelů, není nutné, aby implementovala RunAsync(). Jsou nezbytní pouze posluchače komunikace a jejich přidružený kód. Podobně je vytváření a vracení naslouchacích procesorů volitelné, protože služba může mít pouze práci na pozadí a proto potřebuje implementovat pouze RunAsync().
  • Služba je platná, aby se služba úspěšně dokončila RunAsync() a vrátila se z ní. Dokončení není stav selhání. Dokončení RunAsync() označuje, že práce na pozadí služby byla dokončena. U stavových spolehlivých služeb se RunAsync() znovu volá, když je replika převedena z role Primární na Sekundární a pak povýšena zpět na roli 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 zapisovat do Reliable Collections, a proto nelze 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 vynutit ukončení vaší služby. 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() mají za následek vyvolání OnAbort(), což je poslední příležitost pro službu pokusit se vyčistit a uvolnit veškeré prostředky, které si nárokovala. 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í.

Další kroky