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 escono, invece di eseguire sempre applicazioni e servizi.

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

Nota

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

Semantica e specifica 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 da 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 solo valore consentito.

  • Restart specifica i criteri di riavvio da applicare a CodePackage in ServicePackage in caso di errore. Un CodePackage che termina con un codice di uscita diverso da zero viene considerato non riuscito. I valori consentiti per questo attributo sono OnFailure e , Nevercon OnFailure come impostazione predefinita.

    • Con il criterio di riavvio impostato su OnFailure, qualsiasi CodePackage che ha esito negativo con un riavvio del codice di uscita diverso da zero, con back-off tra errori ripetuti.

    • Con il criterio di riavvio impostato su Never, se qualsiasi CodePackage ha esito negativo, lo stato di distribuzione del pacchetto DeployServicePackage è contrassegnato Non riuscito, ma altri CodePackage continuano l'esecuzione.

Se tutti i CodePackage nel ServicePackage vengono eseguiti per il completamento con esito positivo con il codice 0di uscita, lo stato di distribuzione di DeployServicePackage è contrassegnato come RanToCompletion.

Esempio di codice che usa la semantica RunToCompletion

Esaminiamo un esempio completo che usa la semantica RunToCompletion.

Importante

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

I contenitori di Windows Server non sono compatibili in tutte le versioni di un sistema operativo host. Questo esempio fa riferimento a mcr.microsoft.com/windows/nanoserver:1809. Per altre informazioni, vedere Compatibilità della versione del contenitore Di Windows.

L 'ServiceManifest.xml seguente descrive un ServicePackage costituito da due CodePackage, che rappresentano contenitori. RunToCompletionCodePackage1 registra semplicemente un messaggio a stdout e chiude. RunToCompletionCodePackage2 esegue il ping dell'indirizzo di loopback per un po' e quindi termina con un codice di uscita di 0, 1o 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>

La ApplicationManifest.xml seguente descrive un'applicazione in base alla ServiceManifest.xml illustrata in precedenza. Il codice specifica RunToCompletion ExecutionPolicy per WindowsRunToCompletionServicePackage con un criterio di riavvio di OnFailure.

Al momento WindowsRunToCompletionServicePackage dell'attivazione, vengono avviati i pacchetti CodePackage costitutivi. RunToCompletionCodePackage1 deve uscire correttamente al primo 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>

Eseguire query sullo stato della distribuzione di un pacchetto DeployServicePackage

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

Considerazioni sulla semantica RunToCompletion

Prendere in considerazione 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 semantica RunToCompletion non sono consentiti. Se necessario, è necessario eliminare e ricreare tali applicazioni.
  • Gli eventi di failover possono causare l'esecuzione di CodePackages dopo il completamento corretto, 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". Service Fabric runtime versione 9.0 e successiva non riesce la convalida per tali servizi. SharedProcess è il valore predefinito, quindi è necessario specificare ServicePackageActivationMode="ExclusiveProcess" per usare la semantica RunToCompletion.

Passaggi successivi