RunToCompletion
從 7.1 版開始,Service Fabric 可針對容器和來賓可執行檔應用程式支援 RunToCompletion 語意。 這些語意可啟用會在完成工作後結束的應用程式和服務,而非一直執行的應用程式和服務。
繼續本文之前,建議您先熟悉 Service Fabric 應用程式模型和 Service Fabric 主控模型。
注意
使用 Reliable Services 程式設計模型的服務不支援 RunToCompletion 語意。
RunToCompletion 語意和規格
當您匯入 ServiceManifest 時,您可以將 RunToCompletion 語意指定為 ExecutionPolicy
。 組成 ServiceManifest 的 CodePackage 都會繼承指定的原則。 下列來自 ApplicationManifest.xml 的程式碼片段會提供範例:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
允許兩個屬性:
Type
具有RunToCompletion
作為唯一允許的值。Restart
會指定在失敗時套用至 ServicePackage 中 CodePackage 的重新啟動原則。 以非零結束代碼結束的 CodePackage 會被視為失敗。 此屬性允許的值為OnFailure
和Never
,使用OnFailure
作為預設值。將重新啟動原則設定為
OnFailure
時,任何因非零結束代碼而失敗的 CodePackage 會重新啟動,且重複失敗之間會停止。將重新啟動原則設定為
Never
時,如果有任何 CodePackage 失敗,DeployedServicePackage 的部署狀態就會標示為 [失敗],但其他 CodePackage 可以繼續執行。
如果 ServicePackage 中的所有 CodePackage 都成功執行完成且結束代碼為 0
,則 DeployedServicePackage 的部署狀態會標示為 RanToCompletion。
使用 RunToCompletion 語意的程式碼範例
我們來看一下使用 RunToCompletion 語意的完整範例。
重要
下列範例假設您熟悉使用 Service Fabric 和 Docker 建立 Windows 容器應用程式。
Windows Server 容器在主機 OS 的所有版本之間不相容。 此範例參考 mcr.microsoft.com/windows/nanoserver:1809
。 如需詳細資訊,請參閱 Windows 容器版本相容性。
下列 ServiceManifest.xml 描述由代表容器的兩個 CodePackage 所組成的 ServicePackage。 RunToCompletionCodePackage1
只會將訊息記錄到 stdout 並結束。 RunToCompletionCodePackage2
會 ping 回送位址一段時間,然後以 0
、1
或 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 會根據上面所述的 ServiceManifest.xml 來描述應用程式。 此程式碼會將 WindowsRunToCompletionServicePackage
的 RunToCompletion ExecutionPolicy 重新啟動原則指定為 OnFailure
。
在 WindowsRunToCompletionServicePackage
啟用時,將會啟動其包含的 CodePackage。 RunToCompletionCodePackage1
應該在第一次啟用時成功結束。 RunToCompletionCodePackage2
可能會因為非零結束代碼而失敗,而且會重新啟動,因為重新啟動原則為 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>
查詢 DeployedServicePackage 的部署狀態
您可以查詢 DeployedServicePackage 的部署狀態。
- 從 PowerShell 使用 Get-ServiceFabricDeployedServicePackage
- 從 C# 使用 FabricClient API GetDeployedServicePackageListAsync (String, Uri, String)。
RunToCompletion 語意的考量事項
請考慮有關 RunToCompletion 支援的下列幾點:
- 容器和來賓可執行檔應用程式可支援 RunToCompletion 語意。
- 使用 RunToCompletion 語意的應用程式不允許有升級案例。 若有需要,您必須刪除並重新建立這類應用程式。
- 容錯移轉事件可能會導致 CodePackage 在成功完成後,於相同節點或叢集的其他節點上重新執行。 容錯移轉事件的範例包括節點重新啟動,以及節點上的 Service Fabric 執行階段升級。
- RunToCompletion 與
ServicePackageActivationMode="SharedProcess"
不相容。 Service Fabric 執行階段 9.0 版本與更新版本無法驗證這類服務。SharedProcess
是預設值,因此您必須指定ServicePackageActivationMode="ExclusiveProcess"
使用 RunToCompletion 語意。