Udostępnij za pośrednictwem


Omówienie cyklu życia interfejsu Reliable Services

Podczas myślenia o cyklach życia usług Reliable Services w usłudze Azure Service Fabric 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, co umożliwia 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 narzędzia 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 wyłączania 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ływany, a wszystkie zwrócone odbiorniki są otwierane. ICommunicationListener.OpenAsync() program jest wywoływany na każdym odbiorniku.
  3. Następnie, równolegle, dwie rzeczy się zdarzają -
    • Wywoływana StatelessService.RunAsync() jest metoda usługi.
    • Jeśli istnieje, wywoływana StatelessService.OnOpenAsync() jest metoda usługi. To wywołanie jest nietypowym przesłonięciem, ale jest dostępne. W tej chwili można uruchamiać 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ą zamykane. ICommunicationListener.CloseAsync() program jest wywoływany 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 błąd OperationCanceledException. 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. Funkcja OnCloseAsync jest wywoływana, gdy wystąpienie usługi bezstanowej zostanie bezpiecznie zamknięte. Taka sytuacja może wystąpić, 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. Rzadko przesłonięć StatelessService.OnCloseAsync(), ale może służyć 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() program jest wywoływany na każdym odbiorniku.
    • Jeśli usługa jest usługą pomocniczą, otwarte są tylko te odbiorniki oznaczone jako ListenOnSecondary = true . Używanie odbiorników otwartych 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 dwukrotnie. Raz 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ą zamykane. ICommunicationListener.CloseAsync() program jest wywoływany na każdym odbiorniku.

  2. StatefulServiceBase.OnCloseAsync() metoda jest wywoływana. To wywołanie jest nietypowym przesłonięciem, 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 błąd OperationCanceledException. Usługa Service Fabric czeka na RunAsync() ukończenie.

    Uwaga

    Potrzeba oczekiwania na zakończenie działania funkcji RunAsync jest konieczna 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 awarii lub optymalizacji równoważenia klastra. Co to oznacza pod względem zdarzeń cyklu życia, które może zobaczyć replika? Zachowanie repliki stanowej zależy od tego, czy jest ona zdegradowana, czy promowana podczas zamiany.

W przypadku elementu podstawowego, który jest zdegradowany

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

  1. Wszystkie otwarte odbiorniki są zamykane. ICommunicationListener.CloseAsync() program jest wywoływany 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 błąd OperationCanceledException. 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 potrzebuje 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 rezultacie ten proces wygląda tak, jakby został utworzony podczas tworzenia usługi, z tą różnicą, że sama replika już istnieje. Wywoływane są następujące interfejsy API:

  1. ICommunicationListener.CloseAsync() metoda jest wywoływana dla wszystkich otwartych odbiorników (oznaczonych jako ListenOnSecondary = true).
  2. Wszystkie odbiorniki komunikacji są otwarte. ICommunicationListener.OpenAsync() program jest wywoływany 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 obniżania poziomu; 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, jak można sprawdzić, czy 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 bezproblemowe zatrzymywanie usług. Może to ostatecznie prowadzić do niepowodzenia uaktualnień, które przekroczyły limit czasu i wycofały się. 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 używają one niezawodnych kolekcji. W usłudze Service Fabric po obniżeniu poziomu podstawowego jedną z pierwszych rzeczy jest to, że dostęp do zapisu w stanie bazowym zostanie 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 kategorii trwałych (FabricException) i przejściowych (FabricTransientException). Wyjątki trwałe należy rejestrować i zgłaszać, gdy wyjątki przejściowe mogą być ponawiane na podstawie logiki ponawiania prób.

Obsługa wyjątków pochodzących z użycia ReliableCollections elementu w połączeniu ze zdarzeniami cyklu życia usługi jest ważną częścią testowania i weryfikowania niezawodnej usługi. 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 prawidłowo zaimplementowana i prawidłowo 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, obie lub nie. 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 musi zaimplementować RunAsync()tylko element .
  • Usługa jest prawidłowa do pomyślnego ukończenia RunAsync() i powrotu z niej. Ukończenie nie jest warunkiem niepowodzenia. Ukoń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 wrócić tak szybko, jak to możliwe, po otrzymaniu żądania anulowania. Jeśli Twoja 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 gdy usługa jest usuwana. Ten limit czasu wynosi domyślnie 15 minut.
  • Błędy w OnCloseAsync() ścieżce powodują OnAbort() wywoływanie wywołania, co jest szansą na najlepsze szanse na wyczyszczenie i zwolnienie wszelkich zasobów, które zostały zgłoszone. Jest to zwykle wywoływane w przypadku wykrycia trwał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ływany, gdy replika usługi stanowej zmienia rolę, na przykład na podstawową lub pomocniczą. Repliki podstawowe mają stan zapisu (mogą tworzyć i zapisywać w elementach Reliable Collections). Repliki pomocnicze mają stan odczytu (mogą odczytywać tylko z istniejących kolekcji Reliable Collections). Większość pracy w usłudze stanowej jest wykonywana w repliki podstawowej. Repliki pomocnicze mogą wykonywać walidację tylko do odczytu, generowanie raportów, wyszukiwania danych lub inne zadania tylko do odczytu.

Następne kroki