RunToCompletion
Service Fabric バージョン 7.1 以降では、コンテナーとゲスト実行可能ファイル アプリケーション用の RunToCompletion セマンティクスがサポートされています。 これらのセマンティクスにより、常に実行され続けるアプリケーションやサービスとは対照的な、タスクを完了して終了するアプリケーションやサービスが可能になります。
この記事を読み進める前に、Service Fabric のアプリケーション モデルと Service Fabric のホスティング モデルについて理解を深めておいてください。
注意
RunToCompletion セマンティクスは、Reliable Services プログラミング モデルを使用するサービスではサポートされていません。
RunToCompletion のセマンティクスと仕様
ServiceManifest をインポートするときに、RunToCompletion セマンティクスを ExecutionPolicy
として指定できます。 ServiceManifest を構成するすべての CodePackage は、指定されたポリシーを継承します。 次の ApplicationManifest.xml からのスニペットは、その例を示しています。
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
は次の 2 つの属性を許可します:
Type
は、唯一の許可された値としてRunToCompletion
を使用します。Restart
は、失敗した場合に ServicePackage 内の CodePackage に適用する再起動ポリシーを指定します。 CodePackage が 0 以外の終了コードで終了すると、失敗したと見なされます。 この属性に使用できる値はOnFailure
とNever
であり、既定値はOnFailure
です。再起動ポリシーが
OnFailure
に設定されている場合、0 以外の終了コードで失敗した CodePackage は再起動され、繰り返されるエラーの間にバックオフが発生します。再起動ポリシーが
Never
に設定されていて、いずれかの CodePackage が失敗した場合、DeployedServicePackage のデプロイ状態は Failed としてマークされますが、他の CodePackage は実行を継続します。
ServicePackage 内のすべての CodePackage が実行され、終了コード 0
で正常に完了した場合、DeployedServicePackage のデプロイ状態は RanToCompletion としてマークされます。
RunToCompletion セマンティクスを使用したコードの例
RunToCompletion セマンティクスを使用した完全な例を見てみましょう。
重要
次の例では、Service Fabric と Docker を使用した Windows コンテナー アプリケーションの作成に精通していることを前提としています。
Windows Server コンテナーは、ホスト OS のすべてのバージョンで互換性があるわけではありません。 この例では mcr.microsoft.com/windows/nanoserver:1809
を参照します。 詳細については、「Windows コンテナーのバージョンの互換性」を参照してください。
次の ServiceManifest.xml では、コンテナーを表す 2 つの 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 を基にしたアプリケーションを記述しています。 このコードは、再起動ポリシー OnFailure
を使用して、WindowsRunToCompletionServicePackage
の RunToCompletion ExecutionPolicy を指定しています。
WindowsRunToCompletionServicePackage
をアクティブ化すると、その構成要素 CodePackage が起動されます。 RunToCompletionCodePackage1
は、最初のアクティブ化で正常に終了する必要があります。 RunToCompletionCodePackage2
は、0 以外の終了コードで失敗する可能性があり、再起動ポリシーが 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
が既定値であるため、RunToCompletion セマンティクスを使用するにはServicePackageActivationMode="ExclusiveProcess"
を指定する必要があります。