RunToCompletion
Mulai versi 7.1, Service Fabric mendukung semantik RunToCompletion untuk kontainer dan aplikasi yang dapat dieksekusi tamu. Semantik ini memungkinkan aplikasi dan layanan yang menyelesaikan suatu tugas dan keluar, berbeda dengan, selalu menjalankan aplikasi dan layanan.
Sebelum Anda melanjutkan artikel ini, sebaiknya pelajari model aplikasi Service Fabric dan model hosting Service Fabric.
Catatan
Semantik RunToCompletion saat ini tidak didukung untuk layanan yang menggunakan model pemrograman Layanan Andal.
Semantik dan spesifikasi RunToCompletion
Anda dapat menentukan semantik RunToCompletion sebagai ExecutionPolicy
saat mengimpor ServiceManifest. Semua CodePackages yang terdiri dari ServiceManifest mewarisi kebijakan yang ditentukan. Cuplikan dari ApplicationManifest.xml berikut memberikan contoh:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
memungkinkan dua atribut:
Type
memilikiRunToCompletion
sebagai satu-satunya nilai yang diizinkan.Restart
menentukan kebijakan hidupkan ulang yang akan diterapkan ke CodePackages di ServicePackage jika gagal. CodePackage yang keluar dengan kode keluar non-zero dianggap gagal. Nilai yang diizinkan untuk atribut ini adalahOnFailure
danNever
, dengan nilaiOnFailure
sebagai default.Dengan kebijakan hidupkan ulang diatur ke
OnFailure
, CodePackage apa pun yang gagal dengan kode keluar non-zero dimulai ulang, dengan back-off di antara kegagalan berulang.Dengan kebijakan hidupkan ulang diatur ke
Never
, jika ada CodePackage yang gagal, status penyebaran DeployedServicePackage ditandai sebagai Gagal tetapi CodePackages lainnya melanjutkan eksekusi.
Jika semua CodePackages di dalam ServicePackage berjalan hingga berhasil diselesaikan dengan kode keluar 0
, status penyebaran DeployedServicePackage ditandai sebagai RanToCompletion.
Contoh lengkap menggunakan semantik RunToCompletion
Mari kita lihat contoh lengkap yang menggunakan semantik RunToCompletion.
Penting
Contoh berikut mengasumsikan pengetahuan akan membuat aplikasi kontainer Windows menggunakan Service Fabric dan Docker.
Kontainer Windows Server tidak kompatibel di semua versi OS host. Contoh ini mereferensikan mcr.microsoft.com/windows/nanoserver:1809
. Untuk informasi selengkapnya, lihat Kompatibilitas versi kontainer Windows.
ServiceManifest.xml berikut menjelaskan ServicePackage yang terdiri dari dua CodePackages, yang merepresentasikan kontainer. RunToCompletionCodePackage1
hanya mencatat pesan ke stdout dan keluar. RunToCompletionCodePackage2
melakukan ping ke alamat loopback untuk sementara waktu, kemudian keluar dengan kode keluar 0
, 1
atau 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>
ApplicationManifest.xml berikut menjelaskan aplikasi berdasarkan ServiceManifest.xml yang dibahas di atas. Kode tersebut menentukan ExecutionPolicy RunToCompletion untuk WindowsRunToCompletionServicePackage
dengan kebijakan hidupkan ulang OnFailure
.
Setelah pengaktifan WindowsRunToCompletionServicePackage
, CodePackages konstituennya akan dimulai. RunToCompletionCodePackage1
harus berhasil keluar pada aktivasi pertama. RunToCompletionCodePackage2
dapat gagal dengan kode keluar non-zero, lalu akan dihidupkan ulang karena kebijakan hidupkan ulangnya adalah 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>
Mengkueri status penyebaran DeployedServicePackage
Anda dapat mengkueri status penyebaran DeployedServicePackage.
- Dari PowerShell, gunakan Get-ServiceFabricDeployedServicePackage
- Dari C#, gunakan API FabricClient GetDeployedServicePackageListAsync(String, Uri, String).
Pertimbangan untuk semantik RunToCompletion
Pertimbangkan poin-poin berikut terkait dukungan RunToCompletion:
- Semantik RunToCompletion hanya didukung untuk kontainer dan aplikasi yang dapat dieksekusi tamu.
- Skenario peningkatan untuk aplikasi dengan semantik RunToCompletion tidak diizinkan. Pengguna harus menghapus dan membuat ulang aplikasi tersebut, jika diperlukan.
- Peristiwa failover dapat menyebabkan CodePackages dijalankan kembali setelah berhasil diselesaikan, pada node yang sama atau node kluster lainnya. Contoh peristiwa failover adalah menghidupkan ulang node dan peningkatan runtime Service Fabric pada node.
- RunToCompletion tidak kompatibel dengan
ServicePackageActivationMode="SharedProcess"
. Runtime Service Fabric versi 9.0 dan yang lebih tinggi akan menggagalkan validasi untuk layanan tersebut.SharedProcess
adalah nilai default-nya, jadi Anda harus menentukanServicePackageActivationMode="ExclusiveProcess"
untuk menggunakan semantik RunToCompletion.