RunToCompletion

从 7.1 版开始,Service Fabric 支持适用于容器应用程序和来宾可执行文件应用程序的 RunToCompletion 语义。 这些语义使应用程序和服务一完成任务就退出,不需始终运行应用程序和服务。

继续阅读本文之前,请熟悉 Service Fabric 应用程序模型Service Fabric 托管模型

注释

使用 Reliable Services 编程模型编写的服务目前不支持 RunToCompletion 语义。

RunToCompletion 语义和规范

ExecutionPolicy 时,可将 RunToCompletion 语义指定为 。 构成 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,其中包含表示容器的两个 CodepackageRunToCompletionCodePackage1 直接将消息记录到 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 语义。

后续步骤