RunToCompletion
Sürüm 7.1'den başlayarak Service Fabric, kapsayıcılar ve konuk yürütülebilir uygulamalar için RunToCompletion semantiğini destekler. Bu semantikler, her zaman çalışan uygulama ve hizmetlerin aksine, bir görevi tamamlayan ve çıkan uygulamaları ve hizmetleri etkinleştirir.
Bu makaleye devam etmeden önce Service Fabric uygulama modeli ve Service Fabric barındırma modeli hakkında bilgi sahibi olun.
Not
RunToCompletion semantiği Reliable Services programlama modelini kullanan hizmetler için desteklenmez.
RunToCompletion semantiği ve belirtimi
ServiceManifest'i içeri aktarırken RunToCompletion semantiğini olarak ExecutionPolicy
belirtebilirsiniz. ServiceManifest'i oluşturan tüm CodePackage'lar belirtilen ilkeyi devralır. ApplicationManifest.xml aşağıdaki kod parçacığı bir örnek sağlar:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
iki özniteliğe izin verir:
Type
RunToCompletion
izin verilen tek değerdir.Restart
hata durumunda ServicePackage'daki CodePackage'lara uygulanacak yeniden başlatma ilkesini belirtir. Sıfır olmayan bir çıkış koduyla çıkan codePackage'ın başarısız olduğu kabul edilir. Bu öznitelikOnFailure
için izin verilen değerler varsayılan olarak veNever
değerleridirOnFailure
.Yeniden başlatma ilkesi olarak
OnFailure
ayarlandığında, sıfır olmayan çıkış koduyla başarısız olan tüm CodePackage yeniden başlatılır ve yinelenen hatalar arasında geri almalar olur.Yeniden başlatma ilkesi olarak
Never
ayarlandığında CodePackage başarısız olursa DeployedServicePackage dağıtım durumu Başarısız olarak işaretlenir, ancak diğer CodePackage'lar yürütülmeye devam eder.
ServicePackage'daki tüm CodePackage'lar çıkış koduyla 0
başarıyla tamamlanırsa, DeployedServicePackage dağıtım durumu RanToCompletion olarak işaretlenir.
RunToCompletion semantiği kullanan kod örneği
Şimdi RunToCompletion semantiğini kullanan tam bir örneğe bakalım.
Önemli
Aşağıdaki örnekte, Service Fabric ve Docker kullanarak Windows kapsayıcı uygulamaları oluşturma konusunda bilgi sahibi olduğunuz varsayılır.
Windows Server kapsayıcıları, konak işletim sisteminin tüm sürümlerinde uyumlu değildir. Bu örnek başvurur mcr.microsoft.com/windows/nanoserver:1809
. Daha fazla bilgi için bkz . Windows kapsayıcı sürümü uyumluluğu.
Aşağıdaki ServiceManifest.xml , kapsayıcıları temsil eden iki CodePackage'ı içeren bir ServicePackage açıklanmaktadır. RunToCompletionCodePackage1
yalnızca stdout'a bir ileti kaydeder ve çıkar. RunToCompletionCodePackage2
geri döngü adresine bir süre ping'ler ve ardından , 1
veya 2
çıkış koduyla 0
çıkar.
<?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>
Aşağıdaki ApplicationManifest.xml, yukarıda açıklanan ServiceManifest.xml temel alan bir uygulama açıklanmaktadır. Kod, yeniden başlatma ilkesiyle için WindowsRunToCompletionServicePackage
RunToCompletion ExecutionPolicy'yi OnFailure
belirtir.
Etkinleştirmeden sonra WindowsRunToCompletionServicePackage
, bağlı CodePackage'ları başlatılır. RunToCompletionCodePackage1
ilk etkinleştirmede başarıyla çıkılmalıdır. RunToCompletionCodePackage2
sıfır olmayan bir çıkış koduyla başarısız olabilir ve yeniden başlatma ilkesi olduğundan OnFailure
yeniden başlatılır.
<?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>
DeployedServicePackage'ın dağıtım durumunu sorgulama
DeployedServicePackage dağıtım durumunu sorgulayabilirsiniz.
- PowerShell'den Get-ServiceFabricDeployedServicePackage'ı kullanın
- C# dilinden FabricClient API'si GetDeployedServicePackageListAsync(String, Uri, String) kullanın.
RunToCompletion semantiği için dikkat edilmesi gerekenler
RunToCompletion desteği hakkında aşağıdaki noktaları göz önünde bulundurun:
- RunToCompletion semantiği yalnızca kapsayıcılar ve konuk yürütülebilir uygulamalar için desteklenir.
- RunToCompletion semantiğine sahip uygulamalar için yükseltme senaryolarına izin verilmez. Gerekirse bu tür uygulamaları silmeniz ve yeniden oluşturmanız gerekir.
- Yük devretme olayları, başarıyla tamamlandıktan sonra, aynı düğümde veya kümenin diğer düğümlerinde CodePackage'ların yeniden yürütülmesine neden olabilir. Yük devretme olaylarına örnek olarak düğüm yeniden başlatmaları ve bir düğümdeki Service Fabric çalışma zamanı yükseltmeleri verilebilir.
- RunToCompletion ile
ServicePackageActivationMode="SharedProcess"
uyumsuz. Service Fabric çalışma zamanı sürüm 9.0 ve üzeri, bu tür hizmetler için doğrulamada başarısız oluyor.SharedProcess
varsayılan değerdir, bu nedenle RunToCompletion semantiğini kullanmayı belirtmenizServicePackageActivationMode="ExclusiveProcess"
gerekir.