Panoramica del ciclo di vita di Reliable ServicesReliable services lifecycle overview

Quando si pensa al ciclo di vita di Reliable Services, le nozioni di base del ciclo di vita sono quelle più importanti.When thinking about the lifecycles of Reliable Services, the basics of the lifecycle are the most important. In generale:In general:

  • Durante l'avvioDuring Startup
    • I servizi vengono costruitiServices are constructed
    • Hanno la possibilità di creare e restituire zero o più listenerThey have an opportunity to construct and return zero or more listeners
    • Qualsiasi listener restituito è aperto, consentendo la comunicazione con il servizioAny returned listeners are opened, allowing communication with the service
    • Viene chiamato il metodo RunAsync del servizio che consente al servizio stesso di eseguire operazioni a esecuzione prolungata o in backgroundThe Service's runAsync method is called, allowing the service to do long running or background work
  • Durante l'arrestoDuring shutdown
    • Il token di annullamento passato a RunAsync viene cancellato e i listener vengono chiusiThe cancellation token passed to runAsync is canceled, and the listeners are closed
    • Una volta completata l'operazione, viene eliminato l'oggetto servizio stessoOnce that is complete, the service object itself is destructed

Sono disponibili informazioni dettagliate sull'esatto ordine di questi eventi.There are details around the exact ordering of these events. In particolare, l'ordine degli eventi potrebbe cambiare leggermente a seconda che il servizio Reliable sia con o senza stato.In particular, the order of events may change slightly depending on whether the Reliable Service is Stateless or Stateful. Inoltre, per i servizi con stato, è necessario affrontare lo scenario di scambio del ruolo di primario.In addition, for stateful services, we have to deal with the Primary swap scenario. Durante tale sequenza il ruolo di primario viene trasferito a un'altra replica (o ritorna) senza l'arresto del servizio.During this sequence, the role of Primary is transferred to another replica (or comes back) without the service shutting down. Infine è necessario considerare le condizioni di errore.Finally, we have to think about error or failure conditions.

Avvio di un servizio senza statoStateless service startup

Il ciclo di vita di un servizio senza stato è piuttosto semplice.The lifecycle of a stateless service is fairly straightforward. Di seguito è riportato l'ordine degli eventi:Here's the order of events:

  1. Il servizio viene costruitoThe Service is constructed
  2. Quindi si verificano due cose in parallelo:Then, in parallel two things happen:
    • Viene chiamato StatelessService.createServiceInstanceListeners() e viene aperto qualsiasi listener restituito (viene chiamato CommunicationListener.openAsync() su ogni listener)StatelessService.createServiceInstanceListeners() is invoked and any returned listeners are Opened (CommunicationListener.openAsync() is called on each listener)
    • Viene chiamato il metodo RunAsync (StatelessService.runAsync()) del servizioThe service's runAsync method (StatelessService.runAsync()) is called
  3. Se è presente, viene chiamato il metodo OnOpenAsync del servizio (in particolare, viene chiamato StatelessService.onOpenAsync();If present, the service's own onOpenAsync method is called (Specifically, StatelessService.onOpenAsync() is called. si tratta di un override insolito ma comunque disponibile).This is an uncommon override but it is available).

È importante notare che non vi è alcun ordine tra le chiamate per creare e aprire i listener e RunAsync.It is important to note that there is no ordering between the calls to create and open the listeners and runAsync. I listener possono essere aperti prima dell'avvio di RunAsync.The listeners may open before runAsync is started. Analogamente RunAsync potrebbe essere chiamato prima che i listener di comunicazione vengano aperti o persino creati.Similarly, runAsync may end up invoked before the communication listeners are open or have even been constructed. Se è necessaria una sincronizzazione, la si lascia come esercizio per il responsabile dell'implementazione.If any synchronization is required, it is left as an exercise to the implementer. Soluzioni comuni:Common solutions:

  • Talvolta i listener non possono funzionare fino a quando non vengono create altre informazioni o eseguite determinate operazioni.Sometimes listeners can't function until some other information is created or work done. Per i servizi senza stato queste operazioni solitamente possono essere eseguite nel costruttore del servizio, durante la chiamata di createServiceInstanceListeners() o come parte della costruzione del listener stesso.For stateless services that work can usually be done in the service's constructor, during the createServiceInstanceListeners() call, or as a part of the construction of the listener itself.
  • In alcuni casi il codice in RunAsync non si avvia fino a quando i listener sono aperti.Sometimes the code in runAsync does not want to start until the listeners are open. In questo caso è necessario un po' di coordinamento in più.In this case additional coordination is necessary. Una soluzione comune è un flag interno ai listener che indica quando vengono completati e viene controllato in RunAsync prima di procedere con il lavoro effettivo.One common solution is some flag within the listeners indicating when they have completed, which is checked in runAsync before continuing to actual work.

Arresto di un servizio senza statoStateless service shutdown

Quando si arresta un servizio senza stato, si segue lo stesso modello, solo in senso inverso:When shutting down a stateless service, the same pattern is followed, just in reverse:

  1. In paralleloIn parallel
    • Tutti i listener aperti vengono chiusi (viene chiamato CommunicationListener.closeAsync() su ogni listener)Any open listeners are Closed (CommunicationListener.closeAsync() is called on each listener)
    • Il token di annullamento passato a runAsync() viene annullato (il controllo della proprietà isCancelled del token di annullamento restituisce true e, se viene chiamato, il metodo throwIfCancellationRequested del token restituisce CancellationException)The cancellation token passed to runAsync() is canceled (checking the cancellation token's isCancelled property returns true, and if called the token's throwIfCancellationRequested method throws a CancellationException)
  2. Dopo il completamento di closeAsync() su ogni listener e il completamento di runAsync(), viene chiamato il metodo StatelessService.onCloseAsync() del servizio, se è presente (anche in questo caso si tratta di un override insolito).Once closeAsync() completes on each listener and runAsync() also completes, the service's StatelessService.onCloseAsync() method is called, if present (again this is an uncommon override).
  3. Dopo il completamento di StatelessService.onCloseAsync(), l'oggetto servizio viene eliminatoAfter StatelessService.onCloseAsync() completes, the service object is destructed

Note sul ciclo di vita del servizioNotes on service lifecycle

  • Entrambe le chiamate del metodo runAsync() e di createServiceInstanceListeners sono facoltative.Both the runAsync() method and the createServiceInstanceListeners calls are optional. Un servizio può averne una, entrambe o nessuna.A service may have one of them, both, or neither. Ad esempio, se il servizio esegue tutte le attività in risposta alle chiamate dell'utente, non è necessario implementare runAsync().For example, if the service does all its work in response to user calls, there is no need for it to implement runAsync(). Sono necessari solo i listener di comunicazione e il codice associato.Only the communication listeners and their associated code are necessary. Analogamente creare e restituire i listener di comunicazione è facoltativo, in quanto il servizio potrebbe avere solo operazioni in background da eseguire e perciò richiedere solo l'implementazione di runAsync()Similarly, creating and returning communication listeners is optional, as the service may have only background work to do, and so only needs to implement runAsync()
  • È un comportamento valido per un servizio completare runAsync() correttamente e ritornare.It is valid for a service to complete runAsync() successfully and return from it. Questa non è considerata una condizione di errore e rappresenterebbe il completamento dell'attività in background del servizio.This is not considered a failure condition and would represent the background work of the service completing. Per i servizi Reliable Services con stato viene chiamato nuovamente runAsync() se il servizio è stato abbassato dal livello primario e poi alzato di nuovo al livello primario.For stateful reliable services runAsync() would be called again if the service were demoted from primary and then promoted back to primary.
  • Se un servizio esce da runAsync() generando un'eccezione imprevista, questo è un errore: l'oggetto servizio viene arrestato e viene segnalato un errore di integrità.If a service exits from runAsync() by throwing some unexpected exception, this is a failure and the service object is shut down and a health error reported.
  • Mentre non c'è alcun limite di tempo per il completamento di questi metodi, si perde immediatamente la possibilità di scrivere e quindi non è possibile completare alcuna operazione effettiva.While there is no time limit on returning from these methods, you immediately lose the ability to write and therefore cannot complete any real work. È consigliabile completare al più presto la richiesta di annullamento ricevuta.It is recommended that you return as quickly as possible upon receiving the cancellation request. Se il servizio non risponde a queste chiamate API entro un intervallo di tempo ragionevole, Service Fabric può terminare forzatamente il servizio.If your service does not respond to these API calls in a reasonable amount of time Service Fabric may forcibly terminate your service. In genere ciò accade solo durante gli aggiornamenti delle applicazioni o quando viene eliminato un servizio.Usually this only happens during application upgrades or when a service is being deleted. Questo timeout è di 15 minuti per impostazione predefinita.This timeout is 15 minutes by default.
  • Gli errori nel percorso onCloseAsync() generano la chiamata di onAbort() che rappresenta l'ultima e migliore opportunità del servizio di pulire e rilasciare le risorse che sono state richieste.Failures in the onCloseAsync() path result in onAbort() being called which is a last-chance best-effort opportunity for the service to clean up and release any resources that they have claimed.

Nota

Reliable Services con stato non è ancora supportato in Java.Stateful reliable services are not supported in java yet.

Passaggi successiviNext steps