Поделиться через


RunToCompletion

Начиная с версии 7.1 Service Fabric поддерживает семантику RunToCompletion для контейнеров и гостевых исполняемых приложений. Эта семантика обеспечивает поддержку приложений и служб, которые выполняют задачу и завершают работу, в отличие от постоянно работающих приложений и служб.

Прежде чем продолжить работу с этой статьей, рекомендуется ознакомиться с моделью приложения Service Fabric и моделью размещения Service Fabric.

Примечание.

Семантику RunToCompletion не поддерживают службы, использующие модель программирования Reliable Services.

Семантика и спецификация RunToCompletion

При импорте ServiceManifest можно задать семантику RunToCompletion в качестве ExecutionPolicy. Указанную политику наследуют все элементы CodePackage, включающие ServiceManifest. См. пример в приведенном ниже фрагменте кода ApplicationManifest.xml.

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
  <Policies>
    <ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
  </Policies>
</ServiceManifestImport>

ExecutionPolicy допускает два атрибута:

  • Type имеет RunToCompletion в качестве единственно допустимого значения.

  • Restart указывает политику перезапуска, применяемую к CodePackage в ServicePackage при сбое. Завершение CodePackage с ненулевым кодом считается сбоем. Допустимые значения для этого атрибута — OnFailure и Never. Значение по умолчанию — OnFailure.

    • Если для политики перезапуска задано значение OnFailure, то при сбое с ненулевым кодом завершения любой пакет CodePackage перезапускается с задержками между повторными сбоями.

    • Если политика перезапуска имеет значение Never, то в случае сбоя какого-либо CodePackage состояние развертывания DeployedServicePackage помечается как Failed, но другие CodePackage могут продолжать выполнение.

Если все CodePackage в составе ServicePackage завершаются успешно,т. е. с кодом завершения 0, состояние развертывания DeployedServicePackage помечается как RanToCompletion.

Пример кода с использованием семантики RanToCompletion

Рассмотрим полный пример с использованием семантики RanToCompletion.

Внимание

Приведенный ниже пример предполагает, что вы знаете, как создавать приложения-контейнеры Windows с помощью Service Fabric и Docker.

Контейнеры Windows Server совместимы не со всеми версиями ОС узла. В этом примере используется mcr.microsoft.com/windows/nanoserver:1809. Дополнительные сведения см. в статье Совместимость версий контейнеров Windows.

В следующем файле ServiceManifest.xml описывается ServicePackage, состоящий из двух элементов CodePackage, которые представляют контейнеры. RunToCompletionCodePackage1 просто записывает сообщение в stdout и завершает работу. RunToCompletionCodePackage2 некоторое время проверяет связь с петлевым адресом, а затем завершается с кодом 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 &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. В коде задается политика выполнения RunToCompletion для WindowsRunToCompletionServicePackage с политикой перезапуска 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 — значение по умолчанию, поэтому для использования семантики RunToCompletion необходимо указать ServicePackageActivationMode="ExclusiveProcess".

Следующие шаги