Przegląd cyklu życia usług Reliable Services

Jeśli myślisz o cyklach życia usług Azure Service Fabric Reliable Services, najważniejsze są podstawy cyklu życia. Ogólnie rzecz biorąc, cykl życia obejmuje następujące elementy:

  • Podczas uruchamiania:
    • Usługi są konstruowane.
    • Usługi mogą tworzyć i zwracać zero lub więcej odbiorników.
    • Wszystkie zwrócone odbiorniki są otwierane, umożliwiając komunikację z usługą.
    • Wywoływana jest metoda RunAsync usługi, umożliwiając usłudze wykonywanie długotrwałych zadań lub pracy w tle.
  • Podczas zamykania:
    • Token anulowania przekazany do funkcji RunAsync jest anulowany, a odbiorniki są zamknięte.
    • Po zamknięciu odbiorników sam obiekt usługi zostanie zdestrukturowany.

Istnieją szczegółowe informacje dotyczące dokładnego porządkowania tych zdarzeń. Kolejność zdarzeń może ulec nieznacznej zmianie w zależności od tego, czy usługa Reliable Service jest bezstanowa, czy stanowa. Ponadto w przypadku usług stanowych musimy radzić sobie ze scenariuszem zamiany podstawowej. W trakcie tej sekwencji rola Podstawowa jest przenoszona do innej repliki (lub wraca) bez zamykania usługi. Na koniec musimy myśleć o błędach lub warunkach awarii.

Uruchamianie usługi bezstanowej

Cykl życia usługi bezstanowej jest prosty. Oto kolejność zdarzeń:

  1. Usługa jest konstruowana.
  2. StatelessService.CreateServiceInstanceListeners() jest wywoływana, a wszystkie zwrócone odbiorniki są otwierane. ICommunicationListener.OpenAsync() jest wywoływana na każdym odbiorniku.
  3. Następnie, równolegle, dwie rzeczy się zdarzają -
    • Wywoływana StatelessService.RunAsync() jest metoda usługi.
    • Jeśli istnieje, metoda usługi jest wywoływana StatelessService.OnOpenAsync() . To wywołanie jest nietypowe, ale jest dostępne. W tej chwili można uruchomić zadania inicjowania usługi rozszerzonej.

Zamykanie usługi bezstanowej

Aby zamknąć usługę bezstanową, następuje ten sam wzorzec, po prostu odwrotnie:

  1. Wszystkie otwarte odbiorniki są zamknięte. ICommunicationListener.CloseAsync() jest wywoływana na każdym odbiorniku.
  2. Token anulowania przekazany do RunAsync() jest anulowany. Sprawdzenie właściwości tokenu IsCancellationRequested anulowania zwraca wartość true, a jeśli zostanie wywołana, metoda tokenu ThrowIfCancellationRequested zgłasza OperationCanceledExceptionwartość . Usługa Service Fabric czeka na RunAsync() ukończenie.
  3. Po RunAsync() zakończeniu wywoływana StatelessService.OnCloseAsync() jest metoda usługi, jeśli jest obecna. OnCloseAsync jest wywoływana, gdy wystąpienie usługi bezstanowej zostanie bezpiecznie zamknięte. Może się to zdarzyć, gdy kod usługi jest uaktualniany, wystąpienie usługi jest przenoszone z powodu równoważenia obciążenia lub wykryto błąd przejściowy. Nietypowo można zastąpić StatelessService.OnCloseAsync()element , ale może być używany do bezpiecznego zamykania zasobów, zatrzymywania przetwarzania w tle, kończenie zapisywania stanu zewnętrznego lub zamykanie istniejących połączeń.
  4. Po StatelessService.OnCloseAsync() zakończeniu obiekt usługi zostanie zdestrukturowany.

Uruchamianie usługi stanowej

Usługi stanowe mają podobny wzorzec do usług bezstanowych z kilkoma zmianami. W przypadku uruchamiania usługi stanowej kolejność zdarzeń jest następująca:

  1. Usługa jest konstruowana.

  2. Wywołano metodę StatefulServiceBase.OnOpenAsync(). To wywołanie nie jest często zastępowane w usłudze.

  3. StatefulServiceBase.CreateServiceReplicaListeners() jest wywoływana.

    • Jeśli usługa jest usługą podstawową, wszystkie zwrócone odbiorniki są otwierane. ICommunicationListener.OpenAsync() jest wywoływana na każdym odbiorniku.
    • Jeśli usługa jest usługą pomocniczą, otwierane są tylko te odbiorniki oznaczone jako ListenOnSecondary = true . Posiadanie odbiorników, które są otwarte w sekundach, jest mniej powszechne.
  4. Następnie równolegle:

    • Jeśli usługa jest obecnie podstawową, wywoływana StatefulServiceBase.RunAsync() jest metoda usługi.
    • Wywołano metodę StatefulServiceBase.OnChangeRoleAsync(). To wywołanie nie jest często zastępowane w usłudze.

    Uwaga

    W przypadku nowej repliki StatefulServiceBase.OnChangeRoleAsync() pomocniczej jest wywoływana dwa razy. Po kroku 2, gdy stanie się on bezczynnym pomocniczym i ponownie w kroku 4, gdy staje się aktywnym pomocniczym. Aby uzyskać więcej informacji na temat cyklu życia repliki i wystąpienia, przeczytaj artykuł Replica and Instance Lifecycle (Cykl życia repliki i wystąpienia).

Zamykanie usługi stanowej

Podobnie jak w przypadku usług bezstanowych zdarzenia cyklu życia podczas zamykania są takie same jak podczas uruchamiania, ale odwrócone. Po zamknięciu usługi stanowej występują następujące zdarzenia:

  1. Wszystkie otwarte odbiorniki są zamknięte. ICommunicationListener.CloseAsync() jest wywoływana na każdym odbiorniku.

  2. StatefulServiceBase.OnCloseAsync() metoda jest wywoływana. To wywołanie jest nietypowe, ale jest dostępne.

  3. Token anulowania przekazany do RunAsync() jest anulowany. Sprawdzenie właściwości tokenu IsCancellationRequested anulowania zwraca wartość true, a jeśli zostanie wywołana, metoda tokenu ThrowIfCancellationRequested zgłasza OperationCanceledExceptionwartość . Usługa Service Fabric czeka na RunAsync() ukończenie.

    Uwaga

    Konieczne jest oczekiwanie na zakończenie działania narzędzia RunAsync tylko wtedy, gdy ta replika jest repliką podstawową.

  4. Po StatefulServiceBase.RunAsync() zakończeniu obiekt usługi zostanie zdestrukturowany.

Zamiany podstawowe usługi stanowej

Gdy usługa stanowa jest uruchomiona, tylko repliki podstawowe tych usług stanowych mają otwarte odbiorniki komunikacji i wywołaną metodę RunAsync . Repliki pomocnicze są konstruowane, ale nie widzą żadnych dalszych wywołań. Gdy usługa stanowa jest uruchomiona, replika, która jest obecnie podstawowa, może ulec zmianie w wyniku błędu lub optymalizacji równoważenia klastra. Co to oznacza w odniesieniu do zdarzeń cyklu życia, które może zobaczyć replika? Zachowanie repliki stanowej zależy od tego, czy replika jest zdegradowana, czy promowana podczas zamiany.

Dla podstawowej, która została zdegradowana

W przypadku repliki podstawowej, która została zdegradowana, usługa Service Fabric wymaga tej repliki, aby zatrzymać przetwarzanie komunikatów i zamknąć pracę w tle. W związku z tym ten krok wygląda następująco, gdy usługa zostanie zamknięta. Jedną z różnic jest to, że usługa nie jest zdestruktorowana ani zamknięta, ponieważ pozostaje jako pomocnicza. Wywoływane są następujące interfejsy API:

  1. Wszystkie otwarte odbiorniki są zamknięte. ICommunicationListener.CloseAsync() jest wywoływana na każdym odbiorniku.
  2. Token anulowania przekazany do RunAsync() jest anulowany. Sprawdzenie właściwości tokenu IsCancellationRequested anulowania zwraca wartość true, a jeśli zostanie wywołana, metoda tokenu ThrowIfCancellationRequested zgłasza OperationCanceledExceptionwartość . Usługa Service Fabric czeka na RunAsync() ukończenie.
  3. Odbiorniki oznaczone jako ListenOnSecondary = true są otwierane.
  4. Usługa jest wywoływana StatefulServiceBase.OnChangeRoleAsync() . To wywołanie nie jest często zastępowane w usłudze.

W przypadku podwyższenia poziomu pomocniczego

Podobnie usługa Service Fabric wymaga repliki pomocniczej, która jest promowana, aby rozpocząć nasłuchiwanie komunikatów w sieci i uruchamiać wszystkie zadania w tle, które należy wykonać. W związku z tym ten proces wygląda podobnie do tego, kiedy usługa została utworzona, z tą różnicą, że sama replika już istnieje. Wywoływane są następujące interfejsy API:

  1. ICommunicationListener.CloseAsync() jest wywoływana dla wszystkich otwartych odbiorników (oznaczonych jako ListenOnSecondary = true).
  2. Wszystkie odbiorniki komunikacji są otwierane. ICommunicationListener.OpenAsync() jest wywoływana na każdym odbiorniku.
  3. Następnie równolegle:
    • Wywoływana StatefulServiceBase.RunAsync() jest metoda usługi.
    • Wywołano metodę StatefulServiceBase.OnChangeRoleAsync(). To wywołanie nie jest często zastępowane w usłudze.

Uwaga

CreateServiceReplicaListeners jest wywoływany tylko raz i nie jest wywoływany ponownie podczas podwyższania poziomu repliki lub procesu degradacji; te same ServiceReplicaListener wystąpienia są używane, ale nowe ICommunicationListener wystąpienia są tworzone (przez wywołanie ServiceReplicaListener.CreateCommunicationListener metody) po zamknięciu poprzednich wystąpień.

Typowe problemy podczas zamykania usługi stanowej i degradacji podstawowej

Usługa Service Fabric zmienia podstawową usługę stanową z różnych powodów. Najczęściej są to ponowne równoważenie klastra i uaktualnianie aplikacji. Podczas tych operacji (a także podczas normalnego zamykania usługi, tak jak gdyby usługa została usunięta), ważne jest, aby usługa szanowała usługę CancellationToken.

Usługi, które nie obsługują anulowania, mogą wystąpić kilka problemów. Te operacje są powolne, ponieważ usługa Service Fabric czeka na zatrzymanie usług w sposób bezproblemowy. Może to ostatecznie prowadzić do niepowodzenia uaktualnień, które upłynął limit czasu i wycofać. Niepowodzenie honorowania tokenu anulowania może również spowodować nierównowagę klastrów. Klastry stają się niezrównoważone, ponieważ węzły stają się gorące, ale nie można ponownie zrównoważyć usług, ponieważ przenoszenie ich w innym miejscu trwa zbyt długo.

Ponieważ usługi są stanowe, prawdopodobnie korzystają z kolekcji Reliable Collections. W usłudze Service Fabric po obniżeniu poziomu podstawowego jedną z pierwszych rzeczy, które się dzieje, jest to, że dostęp do zapisu w stanie bazowym jest odwołany. Prowadzi to do drugiego zestawu problemów, które mogą mieć wpływ na cykl życia usługi. Kolekcje zwracają wyjątki na podstawie chronometrażu i tego, czy replika jest przenoszona, czy zamykana. Te wyjątki powinny być prawidłowo obsługiwane. Wyjątki zgłaszane przez usługę Service Fabric należą do trwałych () i przejściowych (FabricExceptionFabricTransientException) kategorii. Wyjątki trwałe powinny być rejestrowane i zgłaszane, podczas gdy wyjątki przejściowe można ponowić na podstawie logiki ponawiania prób.

Obsługa wyjątków pochodzących z użycia ReliableCollections w połączeniu z zdarzeniami cyklu życia usługi jest ważną częścią testowania i walidacji usługi Reliable Service. Zalecamy, aby zawsze uruchamiać usługę pod obciążeniem podczas przeprowadzania uaktualnień i testowania chaosu przed wdrożeniem w środowisku produkcyjnym. Te podstawowe kroki pomagają upewnić się, że usługa jest poprawnie zaimplementowana i obsługuje zdarzenia cyklu życia.

Uwagi dotyczące cyklu życia usługi

  • Zarówno metoda, jak RunAsync() i CreateServiceReplicaListeners/CreateServiceInstanceListeners wywołania są opcjonalne. Usługa może mieć jedną z nich, zarówno, jak i żadną z nich. Jeśli na przykład usługa wykonuje całą swoją pracę w odpowiedzi na wywołania użytkownika, nie ma potrzeby jej implementowania RunAsync(). Niezbędne są tylko odbiorniki komunikacji i skojarzony z nimi kod. Podobnie tworzenie i zwracanie odbiorników komunikacji jest opcjonalne, ponieważ usługa może mieć tylko pracę w tle, a więc tylko musi zaimplementować RunAsync().
  • Jest to prawidłowe, aby usługa została ukończona RunAsync() pomyślnie i została zwrócona z niej. Ukończenie nie jest warunkiem niepowodzenia. Zakończenie RunAsync() wskazuje, że praca w tle usługi została zakończona. W przypadku stanowych niezawodnych usług jest wywoływana ponownie, RunAsync() jeśli replika zostanie zdegradowana z podstawowej do pomocniczej, a następnie podniesiona z powrotem do podstawowej.
  • Jeśli usługa zakończy działanie RunAsync() , zgłaszając nieoczekiwany wyjątek, stanowi to błąd. Obiekt usługi jest zamykany i zgłaszany jest błąd kondycji.
  • Chociaż nie ma limitu czasu na powrót z tych metod, natychmiast utracisz możliwość zapisu w elementach Reliable Collections, a zatem nie można ukończyć żadnej rzeczywistej pracy. Zalecamy, aby powrócić tak szybko, jak to możliwe po otrzymaniu żądania anulowania. Jeśli usługa nie odpowiada na te wywołania interfejsu API w rozsądnym czasie, usługa Service Fabric może wymuszyć zakończenie usługi. Zwykle dzieje się tak tylko podczas uaktualniania aplikacji lub usuwania usługi. Ten limit czasu to domyślnie 15 minut.
  • Błędy w OnCloseAsync() ścieżce powodują OnAbort() wywoływanie, co jest ostatnią szansą na najlepsze wysiłki dla usługi w celu oczyszczenia i zwolnienia wszystkich zasobów, które zostały zgłoszone. Jest to zwykle wywoływane w przypadku wykrycia stałego błędu w węźle lub gdy usługa Service Fabric nie może niezawodnie zarządzać cyklem życia wystąpienia usługi z powodu awarii wewnętrznych.
  • OnChangeRoleAsync() jest wywoływana, gdy replika usługi stanowej zmienia rolę, na przykład na podstawową lub pomocniczą. Repliki podstawowe mają stan zapisu (mogą tworzyć i zapisywać w kolekcjach Reliable Collections). Repliki pomocnicze mają stan odczytu (mogą być odczytywane tylko z istniejących kolekcji reliable). Większość pracy w usłudze stanowej jest wykonywana w repliki podstawowej. Repliki pomocnicze mogą wykonywać walidację tylko do odczytu, generowanie raportów, eksplorację danych lub inne zadania tylko do odczytu.

Następne kroki