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í příležitost vytvářet a vracet nulové nebo více naslouchacích procesů.
    • Všechny vrácené naslouchací procesy 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 zavření naslouchacích procesů se samotný objekt služby destrukuje.

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 pro stavové služby musíme řešit scénář primárního 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 musíme přemýšlet o chybových nebo chybový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 se sestaví.
  2. StatelessService.CreateServiceInstanceListeners() je vyvolána a všechny vrácené naslouchací procesy jsou otevřeny. ICommunicationListener.OpenAsync() je volána na každém naslouchacím procesu.
  3. Pak paralelně dochází ke dvěma věcem –
    • Volá se StatelessService.RunAsync() metoda služby.
    • Pokud je k dispozici, volá se metoda služby StatelessService.OnOpenAsync() . Toto volání je neobvyklé přepsání, 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ě jako v opačném případě:

  1. Všechny otevřené naslouchací procesy jsou zavřené. ICommunicationListener.CloseAsync() je volána na každém naslouchacím procesu.
  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á na RunAsync() dokončení.
  3. Po RunAsync() dokončení se volá metoda služby StatelessService.OnCloseAsync() , pokud je k dispozici. 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 ho použít k bezpečnému zavření StatelessService.OnCloseAsync()prostředků, zastavení zpracování na pozadí, dokončení ukládání externího stavu nebo zavř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 se sestaví.

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

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

    • Pokud je služba primární službou, otevřou se všechny vrácené naslouchací procesy. ICommunicationListener.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é.
  4. 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.

    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é naslouchací procesy jsou zavřené. ICommunicationListener.CloseAsync() je volána na každém naslouchacím procesu.

  2. StatefulServiceBase.OnCloseAsync() metoda je volá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á na RunAsync() 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.

  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é pouze primární repliky těchto stavových služeb své naslouchací procesy komunikace a volají metodu RunAsync . 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 v důsledku optimalizace selhání nebo vyrovnávání clusteru. Co to znamená z hlediska událostí životního cyklu, které vidí replika? Chování stavové repliky závisí na tom, jestli je replika při prohození 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 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:

  1. Všechny otevřené naslouchací procesy jsou zavřené. ICommunicationListener.CloseAsync() je volána na každém naslouchacím procesu.
  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á na RunAsync() dokončení.
  3. Naslouchací procesy označené jako ListenOnSecondary = true se otevřou.
  4. StatefulServiceBase.OnChangeRoleAsync() Služba je volána. 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á je povýšená, aby začala naslouchat zprávům 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á 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 naslouchací procesy komunikace jsou otevřeny. ICommunicationListener.OpenAsync() je volána na každém naslouchacím procesu.
  3. Pak paralelně:
    • Volá se StatefulServiceBase.RunAsync() metoda služby.
    • Volá se StatefulServiceBase.OnChangeRoleAsync(). 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á na řádné zastavení služeb. To může vést k selhání upgradů, které vyprší a vrátí se 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ž dojde ke snížení úrovně primárního objektu, v Service Fabric je jednou z prvních věcí, ke kterým dojde, je odvolání přístupu k zápisu 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ě načasování a toho, jestli 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(). Nezbytné jsou pouze naslouchací procesy komunikace a jejich přidružený kód. Podobně je vytváření a vracení naslouchacích procesů komunikace volitelné, protože služba může mít pouze práci na pozadí, a proto je potřeba implementovat RunAsync()pouze .
  • Služba je platná, aby se služba úspěšně dokončila RunAsync() a vrátila se z ní. Dokončení není chybový stav. Dokončení RunAsync() označuje, že práce na pozadí služby byla dokončena. U stavových spolehlivých služeb se znovu volá, 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 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.
  • Chyby v cestě OnCloseAsync() jsou OnAbort() volány, což je poslední příležitost nejlepšího úsilí pro službu vyčistit a uvolnit 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í.

Další kroky