Implementowanie odporności aplikacji
Funkcje odporności platformy .NET są oparte na projekcie Polly i udostępniane za pośrednictwem Microsoft.Extensions
programu . Możesz dodać standardową strategię odporności, która używa rozsądnych wartości domyślnych, dodając do aplikacji pojedynczy wiersz kodu.
Dodawanie odporności do aplikacji
Aby zwiększyć odporność aplikacji utworzonej przy użyciu architektury mikrousług, używając żądań HTTP między poszczególnymi usługami, wykonaj następujące kroki:
Microsoft.Extensions.Http.Resilience
Dodaj pakiet do projektu.- Dodaj procedurę obsługi odporności do wywołań usługi HttpClient.
- Skonfiguruj strategię odporności.
Dodawanie pakietu NuGet do projektu
Uruchom następujące polecenie, aby dodać pakiet NuGet odporności:
dotnet add package Microsoft.Extensions.Http.Resilience
Uruchomienie tego polecenia z poziomu terminalu w folderze projektu apps spowoduje dodanie odwołania do pakietu do pliku projektu.
W klasie uruchamiania aplikacji dodaj następującą instrukcję using:
using Microsoft.Extensions.Http.Resilience;
Dodawanie strategii odporności
Teraz możesz dodać standardową strategię odporności do usługi HttpClient. Platforma .NET udostępnia tę wbudowaną konfigurację łączącą szereg strategii.
Procedura obsługi żądań przechodzi przez każdą z powyższych strategii w kolejności od lewej do prawej:
- Łączna strategia limitu czasu żądania: określa całkowity czas, który może zająć żądanie. Można to traktować jako ustawienie górnego limitu czasu dla wszystkich innych strategii.
- Strategia ponawiania prób: Ta strategia steruje opcjami liczby ponownych prób, wycofywania i zakłócenia. Te opcje nie mogą przekraczać łącznego limitu czasu ustawionego w poprzedniej strategii.
- Strategia wyłącznika: ta strategia otwiera obwód, jeśli współczynnik awarii przekracza próg.
- Strategia przekroczenia limitu czasu próby: ta strategia określa limit czasu dla każdego pojedynczego żądania. Jeśli żądanie trwa dłużej niż w tym czasie, zgłaszany jest wyjątek.
Tę strategię standardową można dodać ze wszystkimi wartościami domyślnymi, dodając tę metodę rozszerzenia:
.AddStandardResilienceHandler();
Jeśli na przykład zadeklarowaliśmy WebApplication
element , i chcesz dodać strategię odporności do usługi HttpClient, użyj następującego kodu:
builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();
Pierwszy wiersz powyższego kodu dodaje standardową procedurę obsługi odporności do klienta HTTPClient. Spowoduje to użycie wszystkich domyślnych ustawień strategii ponawiania prób i wyłącznika.
Konfigurowanie strategii odporności
Możesz zmienić wartości domyślne dowolnej strategii, określając nowe opcje, na przykład:
.AddStandardResilienceHandler( options =>
{
options.RetryOptions.RetryCount = 10;
options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});
Ten kod zmienia domyślną strategię ponawiania prób, aby mieć maksymalną liczbę wycofań 10, aby użyć liniowego wycofywania i użyć podstawowego opóźnienia wynoszącego 1 sekundę.
Wybrane opcje muszą być ze sobą zgodne. Jeśli na przykład całkowity czas pozostanie domyślny 30 sekund, powyższe opcje ponawiania spowodują wyjątek. Jest to błąd, ponieważ ustawienie wycofywania wykładniczego spowodowałoby całkowity czas ukończenia 10 ponownych prób wynoszący 2046 sekund. Jest to wyjątek środowiska uruchomieniowego, a nie błąd czasu kompilacji.
W poniższej tabeli wymieniono opcje dostępne dla każdej ze strategii.
Łączna liczba opcji limitu czasu żądania | opis |
---|---|
TotalTimeout | Łączny czas, jaki może zająć żądanie. Wartość domyślna to 30 sekund. |
OnTimeout | Funkcja wywołania zwrotnego, która jest wywoływana po upłynął limit czasu żądania. Wartość domyślna to null. |
Opcje ponawiania | opis |
---|---|
RetryCount | Maksymalna liczba ponownych prób. Wartość domyślna to 3. |
BackoffType | Typ wycofywania do użycia. Można wybrać między liniowym i wykładniczym. Wartość domyślna to wykładnik. |
UseJitter | Czy dodać zakłócenia do wycofywania. Funkcja Jitter dodaje losowość do opóźnienia, aby zmniejszyć wzrost obciążenia. Wartość domyślna to true. |
BaseDelay | Opóźnienie między ponownych prób. Wartość domyślna to 2 sekundy. |
Opcje wyłącznika | opis |
---|---|
Podział | Czas trwania wyłącznika. Wartość domyślna to 5 sekund. |
FailureRatio | Stosunek żądań zakończonych niepowodzeniem do żądań zakończonych powodzeniem, które spowodują otwarcie obwodu. Wartość domyślna to 0.1. |
PróbkowanieDuration | Czas trwania obliczanego współczynnika awarii. Wartość domyślna to 30 sekund. |
Onclosed | Funkcja wywołania zwrotnego wywoływana podczas zamykania obwodu. Domyślny ma wartość null. |
OnHalfOpened | Funkcja wywołania zwrotnego wywoływana, gdy obwód jest w połowie otwarty. Domyślny ma wartość null. |
OnOpened | Funkcja wywołania zwrotnego wywoływana podczas otwierania obwodu. Domyślny ma wartość null. |
Opcje limitu czasu próby | opis |
---|---|
Timeout | Czas, jaki może zająć żądanie. Wartość domyślna to 2 sekundy. |
OnTimeout | Funkcja wywołania zwrotnego, która jest wywoływana po upłynął limit czasu żądania. Wartość domyślna to null. |
Na powyższym diagramie sekwencji pokazano, jak poszczególne strategie współpracują ze sobą w standardowej strategii odporności. Aby rozpocząć od czynnika ograniczającego czas podejmowania żądania, jest kontrolowany przez strategię łącznego limitu czasu. Następnie należy ustawić strategię ponawiania prób, aby mieć maksymalną liczbę ponownych prób, która zostanie ukończona w ramach łącznego limitu czasu. Strategia wyłącznika otworzy obwód, jeśli współczynnik awarii przekroczy próg ustawiony dla niego. Strategia limitu czasu próby określa limit czasu dla każdego pojedynczego żądania. Jeśli żądanie trwa dłużej niż w tym czasie, zgłaszany jest wyjątek.