Cykl życia usług Reliable Services
Reliable Services to jeden z modeli programowania dostępnych w usłudze Azure Service Fabric. Podczas poznawania cyklu życia usług Reliable Services najważniejsze jest zrozumienie podstawowych zdarzeń cyklu życia. Dokładne porządkowanie zdarzeń zależy od szczegółów konfiguracji.
Ogólnie rzecz biorąc, cykl życia usług Reliable Services obejmuje następujące zdarzenia:
- Podczas uruchamiania:
- Usługi są konstruowane.
- Usługi mogą tworzyć i zwracać zero lub więcej odbiorników.
- Wszystkie zwrócone odbiorniki są otwierane na potrzeby komunikacji z usługą.
- Metoda usługi
runAsync
jest wywoływana, więc usługa może wykonywać długotrwałą pracę lub w tle.
- Podczas zamykania:
- Token anulowania przekazany do
runAsync
jest anulowany, a odbiorniki są zamykane. - Sam obiekt usługi jest zdestrukturowany.
- Token anulowania przekazany do
Kolejność zdarzeń w usługach Reliable Services może ulec nieznacznej zmianie w zależności od tego, czy niezawodna usługa jest bezstanowa, czy stanowa.
Ponadto w przypadku usług stanowych należy rozwiązać podstawowy scenariusz zamiany. Podczas tej sekwencji rola podstawowa jest przenoszona do innej repliki (lub powraca) bez zamykania usługi.
Na koniec musisz myśleć o błędach lub warunkach awarii.
Uruchamianie usługi bezstanowej
Cykl życia usługi bezstanowej jest dość prosty. Oto kolejność zdarzeń:
- Usługa jest konstruowana.
StatelessService.createServiceInstanceListeners()
jest wywoływana, a wszystkie zwrócone odbiorniki są otwierane.CommunicationListener.openAsync()
program jest wywoływany na każdym odbiorniku.- Następnie równolegle:
- Wywoływana
runAsync
jest metoda usługi (StatelessService.runAsync()
). - Jeśli istnieje, wywoływana jest własna
onOpenAsync
metoda usługi. W szczególnościStatelessService.onOpenAsync()
jest wywoływana. Jest to nietypowe zastąpienie, ale jest dostępne.
- Wywoływana
Zamykanie usługi bezstanowej
Po zamknięciu usługi bezstanowej następuje ten sam wzorzec, ale odwrotnie:
- Wszystkie otwarte odbiorniki są zamykane.
CommunicationListener.closeAsync()
program jest wywoływany na każdym odbiorniku. - Token anulowania, do którego przekazano, jest anulowany
runAsync()
. Sprawdzanie właściwości tokenuisCancelled
anulowania zwracatrue
wartość , a jeśli zostanie wywołana, metoda tokenuthrowIfCancellationRequested
zgłaszaCancellationException
błąd . - Po
runAsync()
zakończeniu wywoływanaStatelessService.onCloseAsync()
jest metoda usługi, jeśli jest obecna. Ponownie nie jest to typowe przesłonięcia, 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ń. - Po
StatelessService.onCloseAsync()
zakończeniu obiekt usługi zostanie zdestrukturowany.
Uruchamianie usługi stanowej
Usługi stanowe mają wzorzec podobny do usług bezstanowych z kilkoma zmianami. Oto kolejność zdarzeń uruchamiania usługi stanowej:
- Usługa jest konstruowana.
- Wywołano metodę
StatefulServiceBase.onOpenAsync()
. To wywołanie nie jest często zastępowane w usłudze. StatefulServiceBase.createServiceReplicaListeners()
jest wywoływana.- Jeśli usługa jest usługą podstawową, wszystkie zwrócone odbiorniki są otwierane.
CommunicationListener.openAsync()
program jest wywoływany na każdym odbiorniku. - Jeśli usługa jest usługą pomocniczą, otwarte są tylko odbiorniki oznaczone jako
listenOnSecondary = true
. Używanie odbiorników otwartych w sekundach jest mniej powszechne.
- Jeśli usługa jest usługą podstawową, wszystkie zwrócone odbiorniki są otwierane.
- Następnie równolegle:
- Jeśli usługa jest obecnie podstawowa, 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.
- Jeśli usługa jest obecnie podstawowa, wywoływana
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:
- Wszystkie otwarte odbiorniki są zamykane.
CommunicationListener.closeAsync()
program jest wywoływany na każdym odbiorniku. - Token anulowania, do którego przekazano, jest anulowany
runAsync()
. Wywołanie metody tokenuisCancelled()
anulowania zwracatrue
metodę , a jeśli zostanie wywołana, metoda tokenuthrowIfCancellationRequested()
zgłasza błądOperationCanceledException
. Usługa Service Fabric czeka narunAsync()
ukończenie.
Uwaga
Oczekiwanie na runAsync
zakończenie jest konieczne tylko wtedy, gdy ta replika jest repliką podstawową.
- Po
runAsync()
zakończeniu wywoływanaStatefulServiceBase.onCloseAsync()
jest metoda usługi. To wywołanie jest nietypowym przesłonięciem, ale jest dostępne. - Po
StatefulServiceBase.onCloseAsync()
zakończeniu obiekt usługi zostanie zdestrukturowany.
Zamiany podstawowe usługi stanowej
Gdy usługa stanowa jest uruchomiona, odbiorniki komunikacji są otwierane, a runAsync
metoda jest wywoływana tylko dla replik podstawowych tych usług stanowych. 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. Zdarzenia cyklu życia, które może zobaczyć replika stanowa, zależą od tego, czy jest ona zdegradowana, czy promowana podczas zamiany.
Dla zdegradowanej podstawowej
Usługa Service Fabric wymaga repliki podstawowej, która została zdegradowana, aby zatrzymać przetwarzanie komunikatów i zatrzymać pracę w tle. Ten krok jest podobny do tego, gdy usługa zostanie zamknięta. Jedną z różnic jest to, że usługa nie jest zdestrukowana ani zamknięta, ponieważ pozostaje jako pomocnicza. Występują wówczas następujące zdarzenia:
- Wszystkie otwarte odbiorniki są zamykane.
CommunicationListener.closeAsync()
program jest wywoływany na każdym odbiorniku. - Token anulowania, do którego przekazano, jest anulowany
runAsync()
. Sprawdzanie metody tokenuisCancelled()
anulowania zwracatrue
wartość . Jeśli zostanie wywołana, metoda tokenuthrowIfCancellationRequested()
zgłasza błądOperationCanceledException
. Usługa Service Fabric czeka narunAsync()
ukończenie. - Odbiorniki oznaczone jako listenOnSecondary = true są otwierane.
- Usługa jest wywoływana
StatefulServiceBase.onChangeRoleAsync()
. To wywołanie nie jest często zastępowane w usłudze.
Dla promowanej pomocniczej
Podobnie usługa Service Fabric potrzebuje repliki pomocniczej, która jest promowana, aby rozpocząć nasłuchiwanie komunikatów w sieci i uruchomić wszystkie zadania w tle, które należy wykonać. Ten proces jest podobny do procesu tworzenia usługi. Różnica polega na tym, że sama replika już istnieje. Występują wówczas następujące zdarzenia:
CommunicationListener.closeAsync()
jest wywoływana dla wszystkich otwartych odbiorników (oznaczonych jako listenOnSecondary = true)- Wszystkie odbiorniki komunikacji są otwarte.
CommunicationListener.openAsync()
program jest wywoływany na każdym odbiorniku. - 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.
- Wywoływana
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 CommunicationListener
wystąpienia są tworzone (przez wywołanie ServiceReplicaListener.createCommunicationListener
metody) po zamknięciu poprzednich wystąpień.
Typowe problemy podczas stanowego zamykania usługi i podstawowego obniżania poziomu
Usługa Service Fabric zmienia podstawową usługę stanową z wielu powodów. Najczęstsze przyczyny to ponowne równoważenie klastra i uaktualnianie aplikacji. Podczas tych operacji ważne jest, aby usługa szanowała usługę cancellationToken
. Dotyczy to również normalnego zamknięcia usługi, na przykład jeśli usługa została usunięta.
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. Nie można jednak ponownie zrównoważyć usług, ponieważ przeniesienie ich do innego miejsca zajmuje zbyt dużo czasu.
Ponieważ usługi są stanowe, prawdopodobnie usługi korzystają z kolekcji Reliable Collections. W usłudze Service Fabric, gdy podstawowa jest zdegradowana, jedną z pierwszych rzeczy, które się dzieje, jest to, że dostęp do zapisu do stanu bazowego 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. Ważne jest, aby prawidłowo obsługiwać te wyjątki.
Wyjątki zgłaszane przez usługę Service Fabric są trwałe (FabricException
) lub przejściowe (FabricTransientException
). Wyjątki trwałe powinny być rejestrowane i zgłaszane. Wyjątki przejściowe można ponawiać na podstawie logiki ponawiania prób.
Ważną częścią testowania i walidacji usług Reliable Services jest obsługa wyjątków, które pochodzą z użycia ReliableCollections
w połączeniu ze zdarzeniami cyklu życia usługi. Zalecamy, aby zawsze uruchamiać usługę pod obciążeniem. Przed wdrożeniem w środowisku produkcyjnym należy również przeprowadzić uaktualnienia i testowanie chaosu. Te podstawowe kroki pomagają upewnić się, że usługa została prawidłowo zaimplementowana i czy prawidłowo obsługuje zdarzenia cyklu życia.
Uwagi dotyczące cyklu życia usługi
- Zarówno metoda, jak
runAsync()
icreateServiceInstanceListeners/createServiceReplicaListeners
wywołania są opcjonalne. Usługa może mieć jedną, 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 implementowaniarunAsync()
. Niezbędne są tylko odbiorniki komunikacji i skojarzony z nimi kod. Podobnie tworzenie i zwracanie odbiorników komunikacji jest opcjonalne. Usługa może mieć tylko pracę w tle, więc musi tylko zaimplementować usługęrunAsync()
. - Usługa jest prawidłowa do pomyślnego ukończenia
runAsync()
i powrotu z niej. Nie jest to uznawane za warunek niepowodzenia. Reprezentuje on pracę w tle ukończenia usługi. W przypadku stanowych usług Reliable Services zostanie ponownie wywołana,runAsync()
jeśli usługa zostanie zdegradowana z warstwy podstawowej, a następnie zostanie podniesiona z powrotem do warstwy podstawowej. - Jeśli usługa zakończy działanie,
runAsync()
zgłaszając nieoczekiwany wyjątek, jest 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 związku z tym nie można ukończyć żadnej rzeczywistej pracy. Zalecamy jak najszybsze zwrócenie żądania anulowania. Jeśli usługa nie odpowiada na te wywołania interfejsu API w rozsądnym czasie, usługa Service Fabric może przymusowo przerwać działanie 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 ścieżce
onCloseAsync()
powodująonAbort()
wywoływanie. To wywołanie jest ostatnią szansą, najlepszą szansą dla usługi w celu oczyszczenia i zwolnienia 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.