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 具有两个属性:

  • TypeRunToCompletion 作为唯一允许的值。

  • Restart 指定在失败时应用于 ServicePackage 中的 CodePackage 的重启策略。 以“非零退出代码”退出的 CodePackage 被视为已失败。 此属性的允许值为 OnFailureNever,默认值为 OnFailure

    • 将重启策略设置为 OnFailure 时,任何因非零退出代码而失败的 CodePackage 都会重新启动,并在重复失败之间进行退避。

    • 当重启策略设置为 NeverNever 时,如果有任何 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 描述了一个 ServicePackage,其中包含表示容器的两个 Codepackage。 RunToCompletionCodePackage1 直接将消息记录到 stdout 并退出。 RunToCompletionCodePackage2 将在一段时间内对环回地址执行 ping 操作,然后以退出代码 012 退出。

<?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 &amp;&amp; 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 &amp;&amp; set /a exitCode=%random% % 3 &amp;&amp; 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 的部署状态。

RunToCompletion 语义的注意事项

关于 RunToCompletion 支持,请注意以下几点:

  • 只有容器来宾可执行应用程序支持 RunToCompletion 语义。
  • 不允许对包含 RunToCompletion 语义的应用程序执行升级方案。 必要时,需要删除并重新创建此类应用程序。
  • 故障转移事件可能会导致 Codepackage 在成功完成后在同一节点上或群集的其他节点上重新执行。 故障转移事件的示例包括:节点重启和节点上的 Service Fabric 运行时升级。
  • RunToCompletion 与 ServicePackageActivationMode="SharedProcess" 不兼容。 Service Fabric 运行时版本 9.0 及更高版本将无法验证此类服务。 SharedProcess 是默认值,因此必须指定 ServicePackageActivationMode="ExclusiveProcess" 以使用 RunToCompletion 语义。

后续步骤