Sdílet prostřednictvím


Ž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.

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

  1. Služba se sestaví.
  2. 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.
  3. Pak paralelně:
    • Volá se runAsync metoda služby (StatelessService.runAsync()).
    • Pokud je k dispozici, volá se vlastní onOpenAsync metoda služby. Konkrétně se StatelessService.onOpenAsync() volá. Toto je neobvyklé přepsání, ale je k dispozici.

Vypnutí bezstavové služby

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

  1. Všechny otevřené naslouchací procesy jsou zavřené. CommunicationListener.closeAsync() je volána na každém naslouchacím procesu.
  2. Token zrušení, kterému runAsync() byl předán, se zruší. Kontrola vlastnosti tokenu isCancelled zrušení vrátí truea pokud je volána, metoda tokenu throwIfCancellationRequested CancellationExceptionvyvolá chybu .
  3. Po runAsync() dokončení se volá metoda služby StatelessService.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í.
  4. 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:

  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. 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é.
  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é. CommunicationListener.closeAsync() je volána na každém naslouchacím procesu.
  2. Token zrušení, kterému runAsync() byl předán, se zruší. Volání metody zrušení tokenu isCancelled() vrátí truea pokud je volána, metoda tokenu throwIfCancellationRequested() vyvolá OperationCanceledException. Service Fabric čeká na runAsync() dokončení.

Poznámka:

Čekání na runAsync dokončení je nezbytné pouze v případě, že je tato replika primární replikou.

  1. Po runAsync() dokončení se volá metoda služby StatefulServiceBase.onCloseAsync() . Toto volání je neobvyklé přepsání, ale je k dispozici.
  2. 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:

  1. Všechny otevřené naslouchací procesy jsou zavřené. CommunicationListener.closeAsync() je volána na každém naslouchacím procesu.
  2. Token zrušení, kterému runAsync() byl předán, se zruší. Kontrola metody zrušení tokenu isCancelled() vrátí true. 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.

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:

  1. CommunicationListener.closeAsync() je volána pro všechny otevřené naslouchací procesy (označeno jako listenOnSecondary = true)
  2. Všechny naslouchací procesy komunikace jsou otevřeny. CommunicationListener.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é 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 i createServiceInstanceListeners/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 implementovat runAsync(). 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í implementovat runAsync()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í.

Další kroky