Overzicht van de levenscyclus van betrouwbare services
Wanneer u nadenkt over de levenscyclus van Azure Service Fabric Reliable Services, zijn de basisprincipes van de levenscyclus het belangrijkste. 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 bouwen en te retourneren.
- 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 achtergrondwerkzaamheden 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 gedestructeerd.
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 voor stateful services omgaan met het primaire swapscenario. Tijdens deze reeks wordt de rol van Primair overgebracht naar een andere replica (of terugkomt) zonder dat de service wordt afgesloten. Ten slotte moeten we nadenken over fout- of foutvoorwaarden.
Stateless service opstarten
De levenscyclus van een staatloze service is eenvoudig. Dit is de volgorde van gebeurtenissen:
- De service is samengesteld.
StatelessService.CreateServiceInstanceListeners()
wordt aangeroepen en eventuele geretourneerde listeners worden geopend.ICommunicationListener.OpenAsync()
wordt op elke listener aangeroepen.- Vervolgens gebeuren er twee dingen parallel -
- De methode van
StatelessService.RunAsync()
de service wordt aangeroepen. - Indien aanwezig, wordt de methode van
StatelessService.OnOpenAsync()
de service aangeroepen. Deze aanroep is een ongebruikelijke onderdrukking, maar deze is beschikbaar. Uitgebreide service-initialisatietaken kunnen op dit moment worden gestart.
- De methode van
Stateless service afsluiten
Voor het afsluiten van een staatloze service wordt hetzelfde patroon gevolgd, gewoon omgekeerd:
- Alle open listeners worden gesloten.
ICommunicationListener.CloseAsync()
wordt op elke listener aangeroepen. - Het doorgegeven
RunAsync()
annuleringstoken wordt geannuleerd. Een controle van de eigenschap vanIsCancellationRequested
het annuleringstoken retourneert true en als dit wordt aangeroepen, genereert de methode vanThrowIfCancellationRequested
het token eenOperationCanceledException
. Service Fabric wacht totdatRunAsync()
het is voltooid. - Na
RunAsync()
voltooiing wordt de methode vanStatelessService.OnCloseAsync()
de service aangeroepen, indien aanwezig. OnCloseAsync wordt aangeroepen wanneer het staatloze service-exemplaar correct 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 overschrijvenStatelessService.OnCloseAsync()
, maar het kan worden gebruikt om resources veilig te sluiten, achtergrondverwerking te stoppen, externe status op te slaan of bestaande verbindingen te sluiten. - Nadat
StatelessService.OnCloseAsync()
het is voltooid, wordt het serviceobject gedestructeerd.
Stateful service opstarten
Stateful services hebben een vergelijkbaar patroon met stateless services, met enkele wijzigingen. Voor het starten van een stateful service is de volgorde van gebeurtenissen als volgt:
De service is samengesteld.
StatefulServiceBase.OnOpenAsync()
wordt aangeroepen. Deze aanroep wordt meestal niet overschreven in de service.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
geopend. Het hebben van listeners die open zijn op secundaire bestanden is minder gebruikelijk.
- Als de service een primaire service is, worden alle geretourneerde listeners geopend.
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 meestal niet overschreven in de service.
Notitie
Voor een nieuwe secundaire replica wordt
StatefulServiceBase.OnChangeRoleAsync()
twee keer aangeroepen. Eenmaal na stap 2, wanneer het een niet-actieve secundaire en opnieuw tijdens stap 4 wordt, wanneer het een actieve secundaire wordt. Lees replica- en exemplaarlevenscyclus voor meer informatie over de levenscyclus van replica's en exemplaren.- Als de service momenteel een primaire service is, wordt de methode van
Stateful service afsluiten
Net als stateless 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:
Alle open listeners worden gesloten.
ICommunicationListener.CloseAsync()
wordt op elke listener aangeroepen.StatefulServiceBase.OnCloseAsync()
de methode wordt aangeroepen. Deze aanroep is een ongebruikelijke onderdrukking, maar is beschikbaar.Het doorgegeven
RunAsync()
annuleringstoken wordt geannuleerd. Een controle van de eigenschap vanIsCancellationRequested
het annuleringstoken retourneert true en als dit wordt aangeroepen, genereert de methode vanThrowIfCancellationRequested
het token eenOperationCanceledException
. Service Fabric wacht totdatRunAsync()
het is voltooid.Notitie
De noodzaak om te wachten tot RunAsync is voltooid, is alleen nodig als deze replica een primaire replica is.
Nadat
StatefulServiceBase.RunAsync()
het is voltooid, wordt het serviceobject gedestructeerd.
Stateful service Primaire wisselingen
Terwijl een stateful service wordt uitgevoerd, hebben alleen de primaire replica's van die stateful services hun communicatielisteners geopend en de RunAsync-methode aangeroepen. Secundaire replica's worden samengesteld, 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 in termen van de levenscyclus-gebeurtenissen die een replica kan zien? Het gedrag dat de stateful replica ziet, is afhankelijk van of het de replica is die wordt gedegradeerd of gepromoveerd tijdens de wissel.
Voor de primaire die wordt gedegradeerd
Voor de primaire replica die wordt gedegradeerd, heeft Service Fabric deze replica nodig om te stoppen met het verwerken van berichten en alle achtergrondtaken af te sluiten. Als gevolg hiervan ziet deze stap eruit alsof deze is uitgevoerd wanneer de service wordt afgesloten. Een verschil is dat de service niet wordt gedestructeerd of gesloten omdat deze als secundaire service blijft. De volgende API's worden aangeroepen:
- Alle open listeners worden gesloten.
ICommunicationListener.CloseAsync()
wordt op elke listener aangeroepen. - Het doorgegeven
RunAsync()
annuleringstoken wordt geannuleerd. Een controle van de eigenschap vanIsCancellationRequested
het annuleringstoken retourneert true en als dit wordt aangeroepen, genereert de methode vanThrowIfCancellationRequested
het token eenOperationCanceledException
. Service Fabric wacht totdatRunAsync()
het is voltooid. - Listeners die zijn gemarkeerd als ListenOnSecondary = true, worden geopend.
- De service
StatefulServiceBase.OnChangeRoleAsync()
wordt aangeroepen. Deze aanroep wordt meestal 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 eventuele achtergrondtaken te starten die moeten worden voltooid. Dit proces ziet er als volgt uit wanneer de service wordt gemaakt, behalve dat de replica zelf al bestaat. De volgende API's worden aangeroepen:
ICommunicationListener.CloseAsync()
wordt aangeroepen voor alle geopende listeners (gemarkeerd met ListenOnSecondary = true).- Alle communicatielisteners worden geopend.
ICommunicationListener.OpenAsync()
wordt op elke listener aangeroepen. - Vervolgens parallel:
- De methode van
StatefulServiceBase.RunAsync()
de service wordt aangeroepen. StatefulServiceBase.OnChangeRoleAsync()
wordt aangeroepen. Deze aanroep wordt meestal niet overschreven in de service.
- De methode van
Notitie
CreateServiceReplicaListeners
wordt slechts één keer aangeroepen en wordt niet opnieuw aangeroepen tijdens het promotie- of degradatieproces van de replica; 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 services en primaire degradatie
Service Fabric wijzigt de primaire van een stateful service om verschillende redenen. De meest voorkomende zijn het opnieuw verdelen van clusters en het upgraden van toepassingen. Tijdens deze bewerkingen (evenals tijdens het afsluiten van de normale service, zoals u zou zien of de service is verwijderd), is het belangrijk dat de service de CancellationToken
.
Services die niet op een schone manier met annulering omgaan, kunnen verschillende problemen ondervinden. Deze bewerkingen zijn traag omdat Service Fabric wacht tot de services correct zijn gestopt. Dit kan uiteindelijk leiden tot mislukte upgrades die een time-out hebben en terugdraaien. Als u het annuleringstoken niet nakomt, kan dit ook onevenwichtige clusters veroorzaken. Clusters worden onevenwichtig omdat knooppunten dynamisch worden, maar de services kunnen niet opnieuw worden geherbalanceerd omdat het te lang duurt om ze ergens anders te verplaatsen.
Omdat de services stateful zijn, is het ook waarschijnlijk dat ze de Reliable Collections gebruiken. Wanneer in Service Fabric een primaire status wordt gedegradeerd, is een van de eerste dingen die gebeuren dat schrijftoegang tot de onderliggende status wordt ingetrokken. Dit leidt tot een tweede set 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 worden gegenereerd door Service Fabric, vallen in permanente (FabricException
) en tijdelijke (FabricTransientException
) categorieën. Permanente uitzonderingen moeten worden vastgelegd en gegenereerd terwijl de tijdelijke uitzonderingen opnieuw kunnen worden geprobeerd op basis van een bepaalde logica voor opnieuw proberen.
Het verwerken van de uitzonderingen die afkomstig zijn van het gebruik van de in combinatie met gebeurtenissen van de ReliableCollections
levenscyclus van de service, is een belangrijk onderdeel van het testen en valideren van een Reliable Service. Het is raadzaam dat u uw service altijd onder belasting uitvoert tijdens het uitvoeren van upgrades en chaostests voordat u in productie implementeert. Deze basisstappen helpen ervoor te zorgen dat uw service correct wordt geïmplementeerd en dat de levenscyclus-gebeurtenissen correct worden verwerkt.
Opmerkingen over de levenscyclus van de service
- Zowel de
RunAsync()
methode als deCreateServiceReplicaListeners/CreateServiceInstanceListeners
aanroepen zijn optioneel. Een service kan er een van hebben, beide of geen van beide. Als de service bijvoorbeeld al zijn werk doet als reactie op gebruikersaanroepen, is het niet nodig om deze te implementerenRunAsync()
. 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 kan hebben, en dus alleen hoeft te worden geïmplementeerdRunAsync()
. - Het is geldig voor een service om deze 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 wordtRunAsync()
opnieuw aangeroepen als de replica wordt gedegradeerd van primair naar secundair en vervolgens weer wordt gepromoveerd naar Primair. - Als een service wordt afgesloten
RunAsync()
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 naar Reliable Collections te schrijven en kan daarom 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 het upgraden van toepassingen of wanneer een service wordt verwijderd. Deze time-out is standaard 15 minuten.
- Fouten in het
OnCloseAsync()
pad resulteren inOnAbort()
aangeroepen, wat een laatste kans is om de service te laten opschonen en eventuele resources vrij te geven die ze hebben geclaimd. Dit wordt meestal aangeroepen wanneer er een permanente fout op het knooppunt wordt gedetecteerd of wanneer Service Fabric de levenscyclus van het service-exemplaar niet betrouwbaar kan beheren vanwege interne fouten. OnChangeRoleAsync()
wordt aangeroepen wanneer de stateful servicereplica de rol wijzigt, bijvoorbeeld naar primaire of secundaire replica. Primaire replica's krijgen de schrijfstatus (mogen betrouwbare verzamelingen maken en schrijven). Secundaire replica's krijgen de leesstatus (kan 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-lezen taken uitvoeren.