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. Te semantyka umożliwia aplikacjom i usługom, które zakończą zadanie i zakończą pracę, 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

Podczas importowania programu ServiceManifest można określić semantyka ExecutionPolicy RunToCompletion. Wszystkie pakiety CodePackage składające się z programu 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 ramach pakietu ServicePackage w przypadku awarii. Pakiet CodePackage, który kończy działanie z kodem zakończenia bez zera, jest uznawany za nieudany. 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 ulegnie awarii, 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ładowy kod korzystający z 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 mcr.microsoft.com/windows/nanoserver:1809się do . Aby uzyskać więcej informacji, zobacz zgodność wersji kontenera systemu Windows.

W poniższym ServiceManifest.xml opisano pakiet ServicePackage składający się z dwóch elementów CodePackage reprezentujących kontenery. RunToCompletionCodePackage1 po prostu rejestruje komunikat do stdout i kończy działanie. RunToCompletionCodePackage2 polecenie ping adres sprzężenia zwrotnego przez pewien czas, a następnie kończy działanie z kodem 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>

Poniższy ApplicationManifest.xml opisuje aplikację na podstawie ServiceManifest.xml omówionych powyżej. Kod określa element RunToCompletion ExecutionPolicy dla WindowsRunToCompletionServicePackage polecenia z zasadami ponownego uruchamiania elementu OnFailure.

Po WindowsRunToCompletionServicePackage aktywacji uruchamiane są jego składniki CodePackages. RunToCompletionCodePackage1 powinno zakończyć się pomyślnie przy pierwszej aktywacji. RunToCompletionCodePackage2 program może zakończyć się niepowodzeniem z kodem zakończenia bez zera 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

Możesz wykonać zapytanie dotyczące stanu wdrożenia wdrożonego pakietuServicePackage.

Zagadnienia dotyczące semantyki RunToCompletion

Należy wziąć pod uwagę następujące kwestie dotyczące obsługi funkcji 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 w środowisku uruchomieniowym usługi Service Fabric w wersji 9.0 lub nowszej kończy się niepowodzeniem. SharedProcess jest wartością domyślną, dlatego należy określić ServicePackageActivationMode="ExclusiveProcess" , aby używać semantyki RunToCompletion.

Następne kroki