RunToCompletion
버전 7.1부터 Service Fabric은 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
는 다음 두 가지 특성을 허용합니다.
Type
은RunToCompletion
이 허용되는 유일한 값입니다.Restart
는 실패 시 ServicePackage의 CodePackages에 적용할 다시 시작 정책을 지정합니다. 0이 아닌 종료 코드로 종료되는 CodePackage는 실패한 것으로 간주됩니다. 이 특성에 허용되는 값은OnFailure
및Never
이며 기본값은OnFailure
입니다.다시 시작 정책을
OnFailure
로 설정하면 0이 아닌 종료 코드로 실패하는 모든 CodePackage가 다시 시작되며 반복된 오류 간에 백오프가 발생합니다.다시 시작 정책을
Never
로 설정하면 CodePackage가 실패하는 경우 DeployedServicePackage의 배포 상태가 Failed로 표시되지만 기타 CodePackage는 계속 실행됩니다.
ServicePackage의 모든 CodePackage가 종료 코드 0
와 함께 성공적으로 완료될 때까지 실행되면 DeployedServicePackage의 배포 상태가 RanToCompletion으로 표시됩니다.
RunToCompletion 의미 체계를 사용하는 코드 예제
RunToCompletion 의미 체계를 사용하는 전체 예제를 살펴보겠습니다.
Important
다음 예제에서는 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을 기반으로 하는 애플리케이션을 설명합니다. 이 코드는 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 의미 체계를 사용하는 애플리케이션에 대한 업그레이드 시나리오는 허용되지 않습니다. 필요한 경우 이러한 애플리케이션을 삭제하고 다시 만들어야 합니다.
- 장애 조치(failover) 이벤트는 CodePackage가 같은 노드나 클러스터의 기타 노드에서 성공적으로 완료된 후 다시 실행되게 할 수 있습니다. 장애 조치(failover) 이벤트의 예시에는 노드 다시 시작과 노드에서의 Service Fabric 런타임 업그레이드가 있습니다.
- RunToCompletion은
ServicePackageActivationMode="SharedProcess"
와 호환되지 않습니다. Service Fabric 런타임 버전 9.0 이상에서는 이러한 서비스에 대한 유효성 검사가 실패합니다.SharedProcess
는 기본값이므로 RunToCompletion 의미 체계를 사용하도록ServicePackageActivationMode="ExclusiveProcess"
를 지정해야 합니다.