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
haRunToCompletion
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 sonoOnFailure
eNever
, conOnFailure
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 0
di 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
, 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 && 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 && set /a exitCode=%random% % 3 && 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 specificareServicePackageActivationMode="ExclusiveProcess"
per usare la semantica RunToCompletion.