Levenscyclusoverzicht van Reliable Services

Wanneer u nadenkt over de levenscyclus van Azure Service Fabric Reliable Services, zijn de basisbeginselen van de levenscyclus het belangrijkst. Over het algemeen omvat de levenscyclus het volgende:

  • Tijdens het opstarten:
    • Services worden samengesteld.
    • De services hebben de mogelijkheid om nul of meer listeners te maken en te retourneren.
    • Alle geretourneerde listeners worden geopend, zodat communicatie met de service mogelijk is.
    • De RunAsync-methode van de service wordt aangeroepen, zodat de service langlopende taken of achtergrondwerk kan uitvoeren.
  • Tijdens het afsluiten:
    • Het annuleringstoken dat is doorgegeven aan RunAsync wordt geannuleerd en de listeners worden gesloten.
    • Nadat de listeners zijn gesloten, wordt het serviceobject zelf verwijderd.

Er zijn details over de exacte volgorde van deze gebeurtenissen. De volgorde van gebeurtenissen kan enigszins veranderen, afhankelijk van of de Reliable Service staatloos of stateful is. Daarnaast moeten we ons voor stateful services bezighouden met het primaire swapscenario. Tijdens deze reeks wordt de rol van Primair overgedragen naar een andere replica (of teruggekomen) zonder dat de service wordt afgesloten. Ten slotte moeten we nadenken over fout- of foutvoorwaarden.

Stateless service opstarten

De levenscyclus van een stateless service is eenvoudig. Dit is de volgorde van de gebeurtenissen:

  1. De service is samengesteld.
  2. StatelessService.CreateServiceInstanceListeners() wordt aangeroepen en alle geretourneerde listeners worden geopend. ICommunicationListener.OpenAsync() wordt op elke listener aangeroepen.
  3. Parallel gebeuren er twee dingen:
    • De methode van de StatelessService.RunAsync() service wordt aangeroepen.
    • Indien aanwezig, wordt de methode van StatelessService.OnOpenAsync() de service aangeroepen. Deze aanroep is een ongebruikelijke overschrijving, maar deze is beschikbaar. Uitgebreide service-initialisatietaken kunnen op dit moment worden gestart.

Stateless service afsluiten

Voor het afsluiten van een stateless service wordt hetzelfde patroon gevolgd, alleen omgekeerd:

  1. Alle open listeners worden gesloten. ICommunicationListener.CloseAsync() wordt op elke listener aangeroepen.
  2. Het annuleringstoken waaraan is doorgegeven RunAsync() , wordt geannuleerd. Een controle van de eigenschap van het annuleringstoken IsCancellationRequested retourneert true en als deze wordt aangeroepen, genereert de methode van ThrowIfCancellationRequested het token een OperationCanceledException. Service Fabric wacht totdat RunAsync() deze is voltooid.
  3. Na RunAsync() voltooiing wordt de methode van StatelessService.OnCloseAsync() de service aangeroepen, indien aanwezig. OnCloseAsync wordt aangeroepen wanneer het staatloze service-exemplaar probleemloos wordt afgesloten. Dit kan gebeuren wanneer de code van de service wordt bijgewerkt, het service-exemplaar wordt verplaatst vanwege taakverdeling of een tijdelijke fout wordt gedetecteerd. Het is ongebruikelijk om te overschrijven StatelessService.OnCloseAsync(), maar het kan worden gebruikt om resources veilig te sluiten, de verwerking op de achtergrond te stoppen, het opslaan van de externe status te voltooien of bestaande verbindingen te sluiten.
  4. Nadat StatelessService.OnCloseAsync() het serviceobject is voltooid, wordt het verwijderd.

Stateful service opstarten

Stateful services hebben een vergelijkbaar patroon als staatloze services, met enkele wijzigingen. Voor het starten van een stateful service is de volgorde van gebeurtenissen als volgt:

  1. De service is samengesteld.

  2. StatefulServiceBase.OnOpenAsync() wordt aangeroepen. Deze aanroep wordt vaak niet overschreven in de service.

  3. StatefulServiceBase.CreateServiceReplicaListeners() wordt aangeroepen.

    • Als de service een primaire service is, worden alle geretourneerde listeners geopend. ICommunicationListener.OpenAsync() wordt op elke listener aangeroepen.
    • Als de service een secundaire service is, worden alleen de listeners geopend die zijn gemarkeerd als ListenOnSecondary = true . Het hebben van listeners die open zijn op secundaire databases is minder gebruikelijk.
  4. Vervolgens parallel:

    • Als de service momenteel een primaire service is, wordt de methode van StatefulServiceBase.RunAsync() de service aangeroepen.
    • StatefulServiceBase.OnChangeRoleAsync() wordt aangeroepen. Deze aanroep wordt vaak niet overschreven in de service.

    Notitie

    Voor een nieuwe secundaire replica StatefulServiceBase.OnChangeRoleAsync() wordt twee keer aangeroepen. Eenmaal na stap 2, wanneer het een niet-actieve secundaire wordt en opnieuw tijdens stap 4, wanneer het een actieve secundaire wordt. Lees Replica en levenscyclus van exemplaren voor meer informatie over de levenscyclus van replica's en exemplaren.

Stateful service afsluiten

Net als staatloze services zijn de levenscyclusgebeurtenissen tijdens het afsluiten hetzelfde als tijdens het opstarten, maar omgekeerd. Wanneer een stateful service wordt afgesloten, vinden de volgende gebeurtenissen plaats:

  1. Alle open listeners worden gesloten. ICommunicationListener.CloseAsync() wordt op elke listener aangeroepen.

  2. StatefulServiceBase.OnCloseAsync() -methode wordt aangeroepen. Deze aanroep is een ongebruikelijke overschrijving, maar is beschikbaar.

  3. Het annuleringstoken waaraan is doorgegeven RunAsync() , wordt geannuleerd. Een controle van de eigenschap van het annuleringstoken IsCancellationRequested retourneert true en als deze wordt aangeroepen, genereert de methode van ThrowIfCancellationRequested het token een OperationCanceledException. Service Fabric wacht totdat RunAsync() deze is voltooid.

    Notitie

    Het is alleen nodig om te wachten tot RunAsync is voltooid als deze replica een primaire replica is.

  4. Nadat StatefulServiceBase.RunAsync() het serviceobject is voltooid, wordt het verwijderd.

Stateful service Primaire wisselingen

Terwijl een stateful service wordt uitgevoerd, hebben alleen de primaire replica's van die stateful services hun communicatie-listeners geopend en hun RunAsync-methode aangeroepen. Secundaire replica's worden gemaakt, maar zien geen verdere aanroepen. Terwijl een stateful service wordt uitgevoerd, kan de replica die momenteel de primaire is, worden gewijzigd als gevolg van fout- of clusterverdelingsoptimalisatie. Wat betekent dit voor de levenscyclus gebeurtenissen die een replica kan zien? Het gedrag dat de stateful replica ziet, is afhankelijk van het feit of de replica wordt gedegradeerd of gepromoveerd tijdens de wissel.

Voor de primaire die is gedegradeerd

Voor de primaire replica die is gedegradeerd, heeft Service Fabric deze replica nodig om de verwerking van berichten te stoppen en eventuele achtergrondwerkzaamheden af te sluiten. Als gevolg hiervan ziet deze stap eruit als wanneer de service wordt afgesloten. Een verschil is dat de service niet wordt verwoest of gesloten, omdat deze als een secundaire service blijft. De volgende API's worden genoemd:

  1. Alle open listeners worden gesloten. ICommunicationListener.CloseAsync() wordt op elke listener aangeroepen.
  2. Het annuleringstoken waaraan is doorgegeven RunAsync() , wordt geannuleerd. Een controle van de eigenschap van het annuleringstoken IsCancellationRequested retourneert true en als deze wordt aangeroepen, genereert de methode van ThrowIfCancellationRequested het token een OperationCanceledException. Service Fabric wacht totdat RunAsync() deze is voltooid.
  3. Listeners die zijn gemarkeerd als ListenOnSecondary = true, worden geopend.
  4. De service StatefulServiceBase.OnChangeRoleAsync() wordt aangeroepen. Deze aanroep wordt vaak niet overschreven in de service.

Voor de secundaire die wordt gepromoveerd

Op dezelfde manier heeft Service Fabric de secundaire replica nodig die wordt gepromoveerd om te beginnen met luisteren naar berichten op de kabel en om achtergrondtaken te starten die moeten worden voltooid. Als gevolg hiervan ziet dit proces eruit zoals bij het maken van de service, behalve dat de replica zelf al bestaat. De volgende API's worden genoemd:

  1. ICommunicationListener.CloseAsync() wordt aangeroepen voor alle geopende listeners (gemarkeerd met ListenOnSecondary = true).
  2. Alle communicatielisteners worden geopend. ICommunicationListener.OpenAsync() wordt aangeroepen op elke listener.
  3. Vervolgens parallel:
    • De methode van de StatefulServiceBase.RunAsync() service wordt aangeroepen.
    • StatefulServiceBase.OnChangeRoleAsync() wordt aangeroepen. Deze aanroep wordt meestal niet overschreven in de service.

Notitie

CreateServiceReplicaListeners wordt slechts eenmaal aangeroepen en wordt niet opnieuw aangeroepen tijdens het replicapromotie- of degradatieproces; dezelfde ServiceReplicaListener exemplaren worden gebruikt, maar er worden nieuwe ICommunicationListener exemplaren gemaakt (door de ServiceReplicaListener.CreateCommunicationListener methode aan te roepen) nadat de vorige exemplaren zijn gesloten.

Veelvoorkomende problemen tijdens het afsluiten van stateful service en primaire degradatie

Service Fabric wijzigt de primaire van een stateful service om verschillende redenen. De meest voorkomende zijn herverdeling van clusters en toepassingsupgrade. Tijdens deze bewerkingen (en tijdens het normale afsluiten van de service, zoals u zou zien of de service is verwijderd), is het belangrijk dat de service de CancellationTokenrespecteert.

Services die annulering niet netjes verwerken, kunnen verschillende problemen ondervinden. Deze bewerkingen zijn traag omdat Service Fabric wacht totdat de services correct worden gestopt. Dit kan uiteindelijk leiden tot mislukte upgrades met een time-out en terugdraaien. Het niet nakomen van het annuleringstoken kan ook leiden tot onevenwichtige clusters. Clusters raken uit balans omdat knooppunten dynamisch worden, maar de services kunnen niet opnieuw in balans worden gebracht omdat het te lang duurt om ze ergens anders te verplaatsen.

Omdat de services stateful zijn, maken ze waarschijnlijk ook gebruik van betrouwbare verzamelingen. Wanneer in Service Fabric een primair niveau wordt gedegradeerd, is een van de eerste dingen die gebeuren dat schrijftoegang tot de onderliggende status wordt ingetrokken. Dit leidt tot een tweede reeks problemen die van invloed kunnen zijn op de levenscyclus van de service. De verzamelingen retourneren uitzonderingen op basis van de timing en of de replica wordt verplaatst of afgesloten. Deze uitzonderingen moeten correct worden verwerkt. Uitzonderingen die door Service Fabric worden gegenereerd, vallen in permanente (FabricException) en tijdelijke (FabricTransientException) categorieën. Permanente uitzonderingen moeten worden geregistreerd en gegenereerd, terwijl de tijdelijke uitzonderingen opnieuw kunnen worden geprobeerd op basis van bepaalde logica voor opnieuw proberen.

Het verwerken van de uitzonderingen die afkomstig zijn van het gebruik van de ReliableCollections in combinatie met servicelevenscyclus-gebeurtenissen is een belangrijk onderdeel van het testen en valideren van een betrouwbare service. We raden u aan om uw service altijd onder belasting uit te voeren tijdens het uitvoeren van upgrades en chaostests voordat u naar productie implementeert. Deze basisstappen helpen ervoor te zorgen dat uw service correct is geïmplementeerd en levenscyclus gebeurtenissen correct verwerkt.

Opmerkingen over de levenscyclus van de service

  • Zowel de RunAsync() methode als de CreateServiceReplicaListeners/CreateServiceInstanceListeners aanroepen zijn optioneel. Een service kan een van beide hebben, beide of geen van beide. Als de service bijvoorbeeld al zijn werk doet als reactie op gebruikersaanroepen, is het niet nodig om te implementeren RunAsync(). Alleen de communicatielisteners en de bijbehorende code zijn nodig. Op dezelfde manier is het maken en retourneren van communicatielisteners optioneel, omdat de service alleen achtergrondwerk hoeft te doen en dus alleen hoeft te worden geïmplementeerd RunAsync().
  • Het is geldig om een service te voltooien RunAsync() en terug te keren. Voltooien is geen foutvoorwaarde. RunAsync() Voltooien geeft aan dat het achtergrondwerk van de service is voltooid. Voor stateful betrouwbare services RunAsync() wordt opnieuw aangeroepen als de replica wordt gedegradeerd van Primair naar Secundair en vervolgens weer wordt gepromoveerd naar Primair.
  • Als een service wordt RunAsync() afgesloten door een onverwachte uitzondering te genereren, is dit een fout. Het serviceobject wordt afgesloten en er wordt een statusfout gerapporteerd.
  • Hoewel er geen tijdslimiet is voor het retourneren van deze methoden, verliest u onmiddellijk de mogelijkheid om te schrijven naar Reliable Collections en daarom kunt u geen echt werk voltooien. We raden u aan zo snel mogelijk terug te keren na ontvangst van de annuleringsaanvraag. Als uw service niet binnen een redelijke tijd op deze API-aanroepen reageert, kan Service Fabric uw service geforceerd beëindigen. Dit gebeurt meestal alleen tijdens toepassingsupgrades of wanneer een service wordt verwijderd. Deze time-out is standaard 15 minuten.
  • Fouten in het OnCloseAsync() pad leiden ertoe OnAbort() dat wordt aangeroepen. Dit is een laatste kans voor de service om resources die ze hebben geclaimd op te schonen en vrij te geven. Dit wordt over het algemeen aangeroepen wanneer er een permanente fout wordt gedetecteerd op het knooppunt of wanneer Service Fabric de levenscyclus van het service-exemplaar niet op betrouwbare wijze kan beheren vanwege interne fouten.
  • OnChangeRoleAsync() wordt aangeroepen wanneer de stateful servicereplica de rol wijzigt, bijvoorbeeld in primair of secundair. Primaire replica's krijgen de schrijfstatus (mogen betrouwbare verzamelingen maken en naar betrouwbare verzamelingen schrijven). Secundaire replica's krijgen de leesstatus (kunnen alleen worden gelezen uit bestaande betrouwbare verzamelingen). Het meeste werk in een stateful service wordt uitgevoerd op de primaire replica. Secundaire replica's kunnen alleen-lezenvalidatie, rapportgeneratie, gegevensanalyse of andere alleen-lezentaken uitvoeren.

Volgende stappen