RunToCompletion

A partire dalla versione 7.1, Service Fabric supporta la semantica RunToCompletion per contenitori e applicazioni eseguibili guest. Queste semantiche consentono applicazioni e servizi che completano un'attività e terminano, a differenza di applicazioni e servizi sempre in esecuzione.

Prima di procedere con questo articolo, è necessario acquisire familiarità con il modello applicativo di Service Fabric e con il modello di hosting di Service Fabric.

Note

La semantica RunToCompletion non è supportata per i servizi che usano il modello di programmazione Reliable Services.

Semantica e specifiche di RunToCompletion

È possibile specificare la semantica RunToCompletion come oggetto ExecutionPolicy quando si importa ServiceManifest. Tutti i CodePackage che comprendono ServiceManifest ereditano i criteri specificati. Il frammento di codice seguente di ApplicationManifest.xml fornisce un esempio:

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
  <Policies>
    <ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
  </Policies>
</ServiceManifestImport>

ExecutionPolicy consente due attributi:

  • Type ha RunToCompletion come unico valore consentito.

  • Restart specifica i criteri di riavvio da applicare ai CodePackage nel ServicePackage in caso di errore. Un CodePackage che esce con un codice di uscita diverso da zero viene considerato non riuscito. I valori consentiti per questo attributo sono OnFailure e Never, con OnFailure come valore predefinito.

    • Con i criteri di riavvio impostati su OnFailure, qualsiasi CodePackage che ha esito negativo con un codice di uscita diverso da zero viene riavviato, con back-off tra errori ripetuti.

    • Con i criteri di riavvio impostati su Never, se un CodePackage ha esito negativo, lo stato di distribuzione del pacchetto DeployServicePackage è contrassegnato come Non riuscito, ma altri CodePackage continuano l'esecuzione.

Se tutti i CodePackage nel ServicePackage vengono eseguiti fino al completamento con codice di uscita 0, lo stato della distribuzione del pacchetto DeployServicePackage è contrassegnato come RanToCompletion.

Esempio di codice che usa la semantica RunToCompletion

Di seguito è riportato un esempio completo che usa la semantica RunToCompletion.

Importante

L'esempio seguente presuppone familiarità con la creazione di applicazioni contenitore Windows con Service Fabric e Docker.

I contenitori di Windows Server non sono compatibili con tutte le versioni del sistema operativo host. In questo esempio viene fatto riferimento a mcr.microsoft.com/windows/nanoserver:1809. Per ulteriori informazioni, vedere Compatibilità delle versioni dei contenitori Windows.

Il file ServiceManifest.xml seguente descrive un ServicePackage costituito da due CodePackage, che rappresentano contenitori. RunToCompletionCodePackage1 registra solo un messaggio in stdout ed esce. RunToCompletionCodePackage2 esegue il ping dell'indirizzo di loopback per un periodo di tempo e quindi viene chiuso con un codice di uscita di 0, 1 o 2.

<?xml version="1.0" encoding="UTF-8"?>
<ServiceManifest Name="WindowsRunToCompletionServicePackage" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Description>Windows RunToCompletion Service</Description>
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="WindowsRunToCompletionServiceType"  UseImplicitHost="true"/>
  </ServiceTypes>
  <CodePackage Name="RunToCompletionCodePackage1" Version="1.0">
    <EntryPoint>
      <ContainerHost>
        <ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
        <Commands>/c,echo Hi from RunToCompletionCodePackage1 &amp;&amp; exit 0</Commands>
        <EntryPoint>cmd</EntryPoint>
      </ContainerHost>
    </EntryPoint>
  </CodePackage>

  <CodePackage Name="RunToCompletionCodePackage2" Version="1.0">
    <EntryPoint>
      <ContainerHost>
        <ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
        <Commands>/v,/c,ping 127.0.0.1 &amp;&amp; set /a exitCode=%random% % 3 &amp;&amp; exit !exitCode!</Commands>
        <EntryPoint>cmd</EntryPoint>
      </ContainerHost>
    </EntryPoint>
  </CodePackage>
</ServiceManifest>

Il file ApplicationManifest.xml seguente descrive un'applicazione basata sul file ServiceManifest.xml descritto in precedenza. Il codice specifica RunToCompletion ExecutionPolicy per WindowsRunToCompletionServicePackage con un criterio di riavvio di OnFailure.

Al momento dell'attivazione di WindowsRunToCompletionServicePackage, vengono avviati i CodePackage costitutivi. RunToCompletionCodePackage1 deve terminare correttamente alla prima attivazione. RunToCompletionCodePackage2 può avere esito negativo con un codice di uscita diverso da zero e verrà riavviato perché il criterio di riavvio è OnFailure.

<?xml version="1.0" encoding="UTF-8"?>
<ApplicationManifest ApplicationTypeName="WindowsRunToCompletionApplicationType" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <Description>Windows RunToCompletion Application</Description>

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="WindowsRunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
    <Policies>
      <ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
    </Policies>
  </ServiceManifestImport>

  <DefaultServices>
    <Service Name="WindowsRunToCompletionService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="WindowsRunToCompletionServiceType" InstanceCount="1">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

Stato della distribuzione delle query di un pacchetto DeployServicePackage

È possibile eseguire query sullo stato di distribuzione di un pacchetto DeployServicePackage.

Considerazioni sulla semantica RunToCompletion

Considerare i punti seguenti sul supporto di RunToCompletion:

  • La semantica RunToCompletion è supportata solo per i contenitori e le applicazioni eseguibili guest.
  • Gli scenari di aggiornamento per le applicazioni con la semantica RunToCompletion non sono consentiti. Se necessario, è necessario eliminare e ricreare tali applicazioni.
  • Gli eventi di failover possono causare la riesecuzione di CodePackage dopo il completamento, nello stesso nodo o in altri nodi del cluster. Esempi di eventi di failover sono i riavvii dei nodi e gli aggiornamenti del runtime di Service Fabric in un nodo.
  • RunToCompletion non è compatibile con ServicePackageActivationMode="SharedProcess". Il runtime di Service Fabric versione 9.0 e successive non riesce a convalidare tali servizi. SharedProcess è il valore predefinito, quindi è necessario specificare ServicePackageActivationMode="ExclusiveProcess" per usare la semantica RunToCompletion.

Passaggi successivi