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í:

  1. Služba je vytvořena.
  2. 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.
  3. 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.

Vypnutí bezstavové služby

Při vypnutí bezstavové služby se postupuje stejně, jen obráceně:

  1. Všechny otevřené naslouchací procesy jsou zavřené. ICommunicationListener.CloseAsync() se volá v každém naslouchacím procesu.
  2. Token zrušení předaný do 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á RunAsync() na dokončení.
  3. Po RunAsync() dokončení se volá metoda služby StatelessService.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í.
  4. 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í:

  1. Služba je vytvořena.

  2. Volá se StatefulServiceBase.OnOpenAsync(). Toto volání není ve službě běžně přepsáno.

  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() 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.
  4. 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.

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:

  1. Všechny otevřené naslouchací procesy jsou zavřené. ICommunicationListener.CloseAsync() se volá v každém naslouchacím procesu.

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

  3. Token zrušení předaný do 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á 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.

  4. 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:

  1. Všechny otevřené naslouchací procesy jsou zavřené. ICommunicationListener.CloseAsync() se volá v každém naslouchacím procesu.
  2. Token zrušení předaný do 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á RunAsync() na dokončení.
  3. Naslouchací procesy označené jako ListenOnSecondary = true se otevřou.
  4. 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:

  1. ICommunicationListener.CloseAsync() se volá pro všechny otevřené naslouchací procesy (označené ListenOnSecondary = true).
  2. Všechny komunikační naslouchací procesy jsou otevřeny. ICommunicationListener.OpenAsync() se volá v každém naslouchacím procesu.
  3. Pak paralelně:
    • Volá se StatefulServiceBase.RunAsync() metoda služby.
    • Volá se StatefulServiceBase.OnChangeRoleAsync(). Toto volání není ve službě často přepsáno.

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 i CreateServiceReplicaListeners/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é implementovat RunAsync(). 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čí implementovat RunAsync()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í za OnAbort() 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í.

Další kroky