애플리케이션 복원력 구현
.NET의 복원력 기능은 Polly 프로젝트를 기반으로 하며 Microsoft.Extensions
를 통해 사용할 수 있습니다. 앱에 코드 한 줄을 추가하여 합리적인 기본값을 사용하는 표준 복원력 전략을 추가할 수 있습니다.
앱에 복원력 추가
개별 서비스 간의 HTTP 요청을 사용하여 마이크로 서비스 아키텍처를 활용해 빌드된 앱에 복원력을 추가하려면 다음 단계를 수행합니다.
Microsoft.Extensions.Http.Resilience
패키지를 프로젝트에 추가합니다.- HttpClient 서비스 호출에 복원력 처리기를 추가합니다.
- 복원력 전략을 구성합니다.
NuGet 패키지를 프로젝트에 추가합니다.
다음 명령을 실행하여 복원력 NuGet 패키지를 추가합니다.
dotnet add package Microsoft.Extensions.Http.Resilience
앱 프로젝트 폴더의 터미널에서 이 명령을 실행하면 프로젝트 파일에 패키지 참조가 추가됩니다.
애플리케이션의 시작 클래스에서 다음 using 문을 추가합니다.
using Microsoft.Extensions.Http.Resilience;
복원력 전략 추가
이제 HttpClient 서비스에 표준 복원력 전략을 추가할 수 있습니다. .NET은 다양한 전략을 결합한 이러한 기본 구성을 제공합니다.
요청 처리기는 위의 각 전략을 왼쪽에서 오른쪽으로 순서대로 진행합니다.
- 총 요청 시간 제한 전략: 이렇게 하면 요청에 소요될 수 있는 총 시간이 설정됩니다. 다른 모든 전략에 대한 상한값을 설정하는 것으로 생각하면 됩니다.
- 재시도 전략 이 전략은 재시도 횟수, 백오프 및 지터 수에 대한 옵션을 제어합니다. 이러한 옵션은 이전 전략에서 설정한 총 시간 제한을 초과할 수 없습니다.
- 회로 차단기 전략 이 전략은 실패율이 임계값을 초과하는 경우 회로를 엽니다.
- 시도 시간 제한 전략: 이 전략은 각 개별 요청에 대한 시간 제한을 설정합니다. 요청이 이 시간보다 오래 걸리면 예외가 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입니다. |
위의 시퀀스 다이어그램은 각 전략이 표준 복원력 전략에서 함께 작동하는 방법을 보여 줍니다. 우선, 요청에 소요되는 시간을 제한하는 요소는 총 시간 제한 전략에 의해 제어됩니다. 그런 다음 재시도 전략은 총 시간 제한 내에 완료될 최대 재시도 횟수를 갖도록 설정해야 합니다. 회로 차단기 전략은 실패율이 설정된 임계값을 초과하는 경우 회로를 엽니다. 재시도 시간 제한 전략은 각 개별 요청에 대한 시간 제한을 설정합니다. 요청이 이 시간보다 오래 걸리면 예외가 throw됩니다.