Wybieranie zasad ponawiania w celu odzyskania sprawności po błędzie przejściowym

Ukończone

Aplikacja do czatów musi odpowiednio reagować odpowiednio na wykryte błędy. Jeśli jest to błąd przejściowy, podjęcie ponownej próby wykonania operacji to rozsądne podejście.

Jednak ponawianie próby wykonania operacji, gdy usługa jest zajęta, tylko pogarsza sytuację. Podobnie jeśli usługa jest niedostępna i powiadomiła klienta, że ma spróbować ponownie za 10 minut, nie ma potrzeby natychmiastowego ponawiania próby. Wiedza na temat wywołanej usługi umożliwia podjęcie decyzji związanych z kluczowych właściwości strategii ponawiania prób. Pierwsza decyzja musi dotyczyć liczby razy, gdy aplikacja będzie podejmować próbę wywołania usługi. Jeśli ta liczba jest większa niż jeden, jak długi powinien być interwał między kolejnymi próbami?

Poniższa tabela zawiera listę typowych strategii interwału ponawiania prób do użycia, gdy wystąpi błąd przejściowy.

Interwał opis
Natychmiastowe ponawianie próby Jeśli pakiety są uszkodzone z powodu problemów z siecią, próba ponownie od razu jest dobrą opcją.
Zwykły Natychmiastowe ponawianie próby, a następnie spróbuj ponownie co 5 sekund.
Przyrostowy Natychmiastowe ponowienie próby, a następnie zwiększ okres oczekiwania o stałe kwoty, 2 sekundy, 4 sekundy, 6 sekund.
Wykładniczy Natychmiastowe ponowienie próby, a następnie zwiększ okres oczekiwania wykładniczo, 1 sekundę, 8 sekund, 20 sekund.
Losowe Może być używany z dowolnymi innymi interwałami ponawiania prób. Celem jest zmniejszenie prawdopodobieństwa ponownego ponawiania próby przez klientów usługi w tym samym czasie.

Dobrą praktyką w zakresie użyteczności jest zastosowanie interwału wykładniczego dla operacji w tle, których użytkownik końcowy może nie zauważyć. W przypadku operacji interaktywnych, takich jak aktualizacje interfejsu użytkownika, regularne próby ponawiania są lepszym rozwiązaniem. Użytkownicy oczekują na jak najmniejszą ilość czasu. W innych przypadkach możesz mieć umowę dotyczącą poziomu usług (SLA) z użytkownikami końcowymi lub umowę obejmującą usługę. Umowa SLA określa sztywny limit liczby przypadków, w których aplikacja może wydać próbę uzyskania odpowiedzi.

Jak wspomniano wcześniej, aplikacje powinny upewnić się, że korzystają z operacji idempotentnych. Zamiast wysyłania operacji delta, na przykład zwiększania lub zmniejszania wartości, należy wysłać wartości bezwzględne, przez ustawienie wartości, a nie ich dostosowywanie.

Przyjrzyjmy się przykładowi, w którym używana usługa zwraca wyjątek HTTP 503: usługa niedostępna. Usługa może zwrócić w odpowiedzi nagłówek Retry-After. Odpowiedź z usługi daje aplikacji najlepszą szansę, aby uzyskać pomyślną odpowiedź. Wiele usług ma wbudowaną możliwość ponawiania prób operacji, więc w niektórych przypadkach ta funkcja może zapewnić wystarczającą funkcjonalność, aby służyć jako strategia ponawiania prób aplikacji.

Po zdefiniowaniu strategii dobrym rozwiązaniem jest posiadanie centralnego procesu lub obiektu obsługującego ponawianie prób. Ten proces umożliwia zmianę parametrów, takich jak maksymalna liczba ponownych prób i interwały ponawiania prób za pośrednictwem konfiguracji. Następnie administratorzy systemu mają elastyczność dostosowywania wydajności aplikacji podczas wdrażania w środowisku produkcyjnym bez konieczności wprowadzania zmian w kodzie.

W ostateczności, jeśli usługa nadal nie odpowiedziała, aplikacja powinna podjąć decyzję o rezygnacji.

Biblioteki zewnętrzne

Chociaż istnieje możliwość pisania własnej logiki ponawiania prób w kodzie, istnieją pewne projekty typu open source, które już skodyfikowały dobre rozwiązania, które przedstawiliśmy tutaj.

W przypadku języka C# istnieje funkcja Polly, obsługuje definiowanie zasad ponawiania, w tym interwałów losowych i wykładniczych. Umożliwia on zatrzymanie ponownych prób po wykonaniu ich określonej liczby lub przy użyciu wyłącznika. Na koniec w przypadku bardziej trwałych błędów można użyć funkcji wycofania i buforowania.

W przypadku języka Java istnieje odporność4j, obsługuje definiowanie zasad ponawiania, w tym interwałów losowych i wykładniczych. Umożliwia on zatrzymanie ponownych prób po wykonaniu ich określonej liczby lub przy użyciu wyłącznika. Na koniec w przypadku bardziej trwałych błędów można użyć funkcji wycofania i buforowania.

W przypadku platformy Node znajduje się plik Polly.js, który jest oparty na projekcie platformy .NET Polly. Ma on mniej funkcji niż biblioteka języka C#, ale implementuje logikę ponawiania prób i wyłącznika.