Udostępnij za pośrednictwem


RunToCompletion

Począwszy od wersji 7.1, usługa Service Fabric obsługuje semantyka RunToCompletion dla kontenerów i aplikacji wykonywalnych gościa. Semantyka ta umożliwia aplikacjom i usługom, które zakończą zadanie i zakończą działanie, w przeciwieństwie do zawsze uruchomionych aplikacji i usług.

Przed kontynuowaniem pracy z tym artykułem zapoznaj się z modelem aplikacji usługi Service Fabric i modelem hostingu usługi Service Fabric.

Uwaga

Semantyka RunToCompletion nie jest obsługiwana w przypadku usług korzystających z modelu programowania usług Reliable Services .

Semantyka i specyfikacja runToCompletion

Semantyka RunToCompletion można określić jako semantykę ExecutionPolicy podczas importowania pliku ServiceManifest. Wszystkie pakiety CodePackage składające się z pliku ServiceManifest dziedziczą określone zasady. Poniższy fragment kodu z ApplicationManifest.xml zawiera przykład:

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

ExecutionPolicy zezwala na dwa atrybuty:

  • Type ma RunToCompletion jako jedyną dozwoloną wartość.

  • Restart określa zasady ponownego uruchamiania, które mają być stosowane do pakietu CodePackage w usłudze ServicePackage po awarii. Pakiet CodePackage, który kończy działanie z kodem zakończenia bez zera, jest uznawany za niepowodzenie. Dozwolone wartości dla tego atrybutu to OnFailure i Never, z wartościami domyślnymi OnFailure .

    • Po ustawieniu zasad ponownego uruchamiania na OnFailurewartość wszystkie pakiety CodePackage, które kończą się niepowodzeniem z ponownym uruchomieniem kodu zakończenia bez zera, z wycofywaniem między powtarzającymi się awariami.

    • Po ustawieniu zasad ponownego uruchamiania na Neverwartość , jeśli jakikolwiek pakiet CodePackage zakończy się niepowodzeniem, stan wdrożenia pakietu DeployedServicePackage jest oznaczony jako Niepowodzenie, ale inne pakiety CodePackage kontynuują wykonywanie.

Jeśli wszystkie pakiety CodePackage w usłudze ServicePackage zostaną uruchomione w celu pomyślnego ukończenia z kodem 0zakończenia, stan wdrożenia wdrożonego pakietuServicePackage zostanie oznaczony jako RanToCompletion.

Przykład kodu używający semantyki RunToCompletion

Przyjrzyjmy się kompletnego przykładu, który używa semantyki RunToCompletion.

Ważne

W poniższym przykładzie założono, że znajomość tworzenia aplikacji kontenera systemu Windows przy użyciu usługi Service Fabric i platformy Docker.

Kontenery systemu Windows Server nie są zgodne ze wszystkimi wersjami systemu operacyjnego hosta. Ten przykład odwołuje się do mcr.microsoft.com/windows/nanoserver:1809. Aby uzyskać więcej informacji, zobacz zgodność wersji kontenera systemu Windows.

W poniższej ServiceManifest.xml opisano pakiet ServicePackage składający się z dwóch elementów CodePackage, które reprezentują kontenery. RunToCompletionCodePackage1 po prostu rejestruje komunikat do stdout i kończy. RunToCompletionCodePackage2 wysyła polecenie ping do adresu sprzężenia zwrotnego przez pewien czas, a następnie kończy działanie za pomocą kodu 0zakończenia polecenia , 1lub 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>

W poniższej ApplicationManifest.xml opisano aplikację opartą na ServiceManifest.xml omówionych powyżej. Kod określa element RunToCompletion ExecutionPolicy dla WindowsRunToCompletionServicePackage polecenia z zasadami ponownego uruchamiania .OnFailure

Po WindowsRunToCompletionServicePackage aktywacji uruchamiane są jego składowe pakiety CodePackage. RunToCompletionCodePackage1 powinno zakończyć się pomyślnie podczas pierwszej aktywacji. RunToCompletionCodePackage2 może zakończyć się niepowodzeniem z kodem zakończenia niezerowym i zostanie uruchomiony ponownie, ponieważ zasady ponownego uruchamiania to 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>

Stan wdrożenia zapytania wdrożonego pakietuServicePackage

Stan wdrożenia wdrożonego pakietuServicePackage można wykonać względem zapytania.

Zagadnienia dotyczące semantyki RunToCompletion

Rozważ następujące kwestie dotyczące obsługi elementu RunToCompletion:

  • Semantyka RunToCompletion jest obsługiwana tylko w przypadku kontenerów i aplikacji wykonywalnych gościa.
  • Scenariusze uaktualniania aplikacji z semantykami RunToCompletion nie są dozwolone. W razie potrzeby należy usunąć i ponownie utworzyć takie aplikacje.
  • Zdarzenia trybu failover mogą spowodować ponowne wykonanie pakietów CodePackage po pomyślnym zakończeniu w tym samym węźle lub w innych węzłach klastra. Przykładami zdarzeń trybu failover są ponowne uruchomienia węzła i uaktualnienia środowiska uruchomieniowego usługi Service Fabric w węźle.
  • Element RunToCompletion jest niezgodny z elementem ServicePackageActivationMode="SharedProcess". Sprawdzanie poprawności takich usług kończy się niepowodzeniem w środowisku uruchomieniowym usługi Service Fabric w wersji 9.0 lub nowszej. SharedProcess jest wartością domyślną, dlatego należy określić ServicePackageActivationMode="ExclusiveProcess" , aby używać semantyki RunToCompletion.

Następne kroki