Condividi tramite


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, 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 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 0di uscita , lo stato della distribuzione di 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 in tutte le versioni di un 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.

L'ServiceManifest.xml seguente descrive un ServicePackage costituito da due CodePackage, che rappresentano contenitori. RunToCompletionCodePackage1 registra solo un messaggio a 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, 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>

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

Al momento WindowsRunToCompletionServicePackage dell'attivazione, 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.

  • Da PowerShell usare Get-ServiceFabricDeployedServicePackage
  • Da C# usare l'API FabricClient GetDeployedServicePackageListAsync(String, Uri, String).

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 rieseguizione 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