애플리케이션 복원력 구현

완료됨

.NET의 복원력 기능은 Polly 프로젝트를 기반으로 하며 Microsoft.Extensions를 통해 사용할 수 있습니다. 앱에 코드 한 줄을 추가하여 합리적인 기본값을 사용하는 표준 복원력 전략을 추가할 수 있습니다.

앱에 복원력 추가

개별 서비스 간의 HTTP 요청을 사용하여 마이크로 서비스 아키텍처를 활용해 빌드된 앱에 복원력을 추가하려면 다음 단계를 수행합니다.

  1. Microsoft.Extensions.Http.Resilience 패키지를 프로젝트에 추가합니다.
  2. HttpClient 서비스 호출에 복원력 처리기를 추가합니다.
  3. 복원력 전략을 구성합니다.

NuGet 패키지를 프로젝트에 추가합니다.

다음 명령을 실행하여 복원력 NuGet 패키지를 추가합니다.

dotnet add package Microsoft.Extensions.Http.Resilience

앱 프로젝트 폴더의 터미널에서 이 명령을 실행하면 프로젝트 파일에 패키지 참조가 추가됩니다.

애플리케이션의 시작 클래스에서 다음 using 문을 추가합니다.

using Microsoft.Extensions.Http.Resilience;

복원력 전략 추가

이제 HttpClient 서비스에 표준 복원력 전략을 추가할 수 있습니다. .NET은 다양한 전략을 결합한 이러한 기본 구성을 제공합니다.

A diagram showing the strategies included in the Standard Resilience Handler. From overall timeout, retry, bulkhead, circuit breaker, and attempt timeout.

요청 처리기는 위의 각 전략을 왼쪽에서 오른쪽으로 순서대로 진행합니다.

  • 총 요청 시간 제한 전략: 이렇게 하면 요청에 소요될 수 있는 총 시간이 설정됩니다. 다른 모든 전략에 대한 상한값을 설정하는 것으로 생각하면 됩니다.
  • 재시도 전략 이 전략은 재시도 횟수, 백오프 및 지터 수에 대한 옵션을 제어합니다. 이러한 옵션은 이전 전략에서 설정한 총 시간 제한을 초과할 수 없습니다.
  • 회로 차단기 전략 이 전략은 실패율이 임계값을 초과하는 경우 회로를 엽니다.
  • 시도 시간 제한 전략: 이 전략은 각 개별 요청에 대한 시간 제한을 설정합니다. 요청이 이 시간보다 오래 걸리면 예외가 throw됩니다.

이 확장 메서드를 추가하여 모든 기본값과 함께 이 표준 전략을 추가할 수 있습니다.

.AddStandardResilienceHandler();

예를 들어 WebApplication을 선언한 경우 HttpClient 서비스에 복원력 전략을 추가하려면 다음 코드를 사용합니다.

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

위에 나와 있는 코드의 첫 번째 줄은 HTTPClient에 표준 복원력 처리기를 추가합니다. 그러면 재시도 및 회로 차단기 전략에 대한 모든 기본 설정이 사용됩니다.

복원력 전략 구성

예를 들어 새 옵션을 지정하여 전략의 기본값을 변경할 수 있습니다.

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

이 코드는 재시도 전략 기본값을 최대 사용 중지 10개로 변경하고, 선형 백오프를 사용하고, 기본 지연 시간을 1초로 사용합니다.

선택한 옵션은 서로 호환되어야 합니다. 예를 들어 총 시간이 기본값인 30초로 유지되는 경우 위의 재시도 옵션으로 인해 예외가 발생합니다. 지수 백오프 설정으로 인해 10번의 재시도를 완료하는 총 시간이 2,046초가 되기 때문에 이는 오류에 해당하며, 컴파일 시간 오류가 아니라 런타임 예외입니다.

다음 표에는 각 전략에 사용할 수 있는 옵션이 나와 있습니다.

총 요청 시간 제한 옵션 설명
TotalTimeout 요청에 소요될 수 있는 총 시간입니다. 기본값은 30초입니다.
OnTimeout 요청 시간이 초과될 때 호출되는 콜백 함수입니다. 기본값은 null입니다.

옵션을 다시 시도 하십시오. 설명
RetryCount 최대 재시도 수 기본값은 3입니다.
BackoffType 사용할 백오프의 유형입니다. 선형 및 지수 중에서 선택할 수 있습니다. 기본값은 지수입니다.
UseJitter 백오프에 지터를 추가할지 여부입니다. 지터는 부하 급증을 줄이기 위해 지연에 임의성을 추가합니다. 기본값은 true입니다.
BaseDelay 재시도 사이의 지연입니다. 기본값은 2초입니다.

회로 차단기 옵션입니다. 설명
BreakDuration 회로 중단의 기간입니다. 기본값은 5초입니다.
FailureRatio 회로를 열 성공한 요청과 실패한 요청 간의 비율입니다. 기본값은 0.1입니다.
SamplingDuration 실패 비율을 계산하는 기간입니다. 기본값은 30초입니다.
OnClosed() 회로가 닫혀 있을 때 호출되는 콜백 함수입니다. 기본값은 null입니다.
OnHalfOpened 회로가 반쯤 열려 있을 때 호출되는 콜백 함수입니다. 기본값은 null입니다.
Onopened 회로가 열려 있을 때 호출되는 콜백 함수입니다. 기본값은 null입니다.

시도 시간 제한 옵션입니다. 설명
Timeout 요청에 소요될 수 있는시간입니다. 기본값은 2초입니다.
OnTimeout 요청 시간이 초과될 때 호출되는 콜백 함수입니다. 기본값은 null입니다.

A sequence diagram showing the flow of events in an application using a resiliency strategy.

위의 시퀀스 다이어그램은 각 전략이 표준 복원력 전략에서 함께 작동하는 방법을 보여 줍니다. 우선, 요청에 소요되는 시간을 제한하는 요소는 총 시간 제한 전략에 의해 제어됩니다. 그런 다음 재시도 전략은 총 시간 제한 내에 완료될 최대 재시도 횟수를 갖도록 설정해야 합니다. 회로 차단기 전략은 실패율이 설정된 임계값을 초과하는 경우 회로를 엽니다. 재시도 시간 제한 전략은 각 개별 요청에 대한 시간 제한을 설정합니다. 요청이 이 시간보다 오래 걸리면 예외가 throw됩니다.