Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с версии 7.1 Service Fabric поддерживает семантику RunToCompletion для контейнеров и гостевых исполняемых приложений. Эти семантики позволяют приложениям и службам завершать выполнение задачи и прекращать работу, в отличие от постоянно работающих приложений и служб.
Прежде чем продолжить работу с этой статьей, ознакомьтесь с моделью приложения Service Fabric и моделью размещения Service Fabric.
Замечание
Семантика RunToCompletion не поддерживается для служб, использующих модель программирования Reliable Services .
Семантика и спецификация RunToCompletion
При импорте ServiceManifest можно указать семантику ExecutionPolicy
RunToCompletion. Все пакеты 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 отмечается как ошибкой, но другие CodePackage продолжают выполняться.
Если все ПакетыКода в ПакетеСервиса завершаются успешно с кодом 0
выхода, состояние развертывания DeployedServicePackage помечается как RanToCompletion.
Пример кода с использованием семантики RunToCompletion
Рассмотрим полный пример использования семантики RunToCompletion.
Это важно
В следующем примере предполагается знакомство с созданием приложений контейнеров Windows с помощью Service Fabric и Docker.
Контейнеры Windows Server несовместимы во всех версиях ос узла. В этом примере упоминается mcr.microsoft.com/windows/nanoserver:1809
. Дополнительные сведения см. в статье Совместимость версий контейнеров Windows.
В следующем ServiceManifest.xml описывается ServicePackage, состоящий из двух codePackage, представляющих контейнеры.
RunToCompletionCodePackage1
просто записывает сообщение в stdout и завершает работу.
RunToCompletionCodePackage2
пингует loopback-адрес ненадолго, а затем завершает работу с кодом выхода либо 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 , описанного выше. Код указывает на использование политики выполнения RunToCompletion ExecutionPolicy для WindowsRunToCompletionServicePackage
с политикой перезапуска OnFailure
.
После WindowsRunToCompletionServicePackage
активации запускаются составляющие CodePackages.
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 можно запросить.
- В PowerShell используйте Get-ServiceFabricDeployedServicePackage
- В C# используйте API FabricClientGetDeployedServicePackageListAsync(String, Uri, String).
Рекомендации по семантике RunToCompletion
Рассмотрим следующие моменты о поддержке RunToCompletion:
- Семантика RunToCompletion поддерживается только для контейнеров и гостевых исполняемых приложений.
- Сценарии обновления для приложений с семантикой RunToCompletion запрещены. При необходимости необходимо удалить и повторно создать такие приложения.
- События отработки отказа могут привести к повторному выполнению CodePackages после успешного завершения на том же узле или на других узлах кластера. Примерами событий отказоустойчивости являются перезапуск узла и обновление среды выполнения Service Fabric на узле.
- RunToCompletion несовместим с
ServicePackageActivationMode="SharedProcess"
. Среда выполнения Service Fabric версии 9.0 и выше не проходит проверку для таких служб.SharedProcess
— это значение по умолчанию, поэтому для использования семантики RunToCompletion необходимо указатьServicePackageActivationMode="ExclusiveProcess"
.