IHttpClientFactory 및 Polly 정책을 통해 지수 백오프를 사용하여 HTTP 호출 다시 시도 구현
팁
이 콘텐츠는 eBook, 컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로 서비스 아키텍처에서 발췌한 것이며, .NET 문서에서 제공되거나 오프라인 상태에서도 읽을 수 있는 PDF(무료 다운로드 가능)로 제공됩니다.
지수 백오프를 사용하는 다시 시도는 오픈 소스 Polly 라이브러리와 같은 고급 .NET 라이브러리를 활용하는 것이 좋습니다.
Polly는 복원력 및 일시적인 오류 처리 기능을 제공하는 .NET 라이브러리입니다. 다시 시도, 회로 차단기, 격벽(Bulkhead) 격리, 시간 제한 및 대체와 같은 Polly 정책을 적용하여 이러한 기능을 구현할 수 있습니다. Polly는 .NET Framework 4.x 및 .NET Standard 1.0, 1.1 및 2.0(.NET Core 이상 지원)을 대상으로 합니다.
다음 단계에서는 이전 섹션에서 설명한 IHttpClientFactory
에 통합된 Polly를 통해 Http 다시 시도를 사용하는 방법을 보여 줍니다.
.NET 패키지 설치
먼저, Microsoft.Extensions.Http.Polly
패키지를 설치해야 합니다.
.NET 8패키지 참조
IHttpClientFactory
는 .NET Core 2.1부터 사용할 수 있지만 프로젝트에서 NuGet의 최신 .NET 8 패키지를 사용하는 것이 좋습니다. 또한 일반적으로 확장 패키지 Microsoft.Extensions.Http.Polly
를 참조해야 합니다.
앱 시작 시 Polly의 재시도 정책으로 클라이언트 구성
AddPolicyHandler()는 사용할 HttpClient
개체에 정책을 추가하는 메서드입니다. 이 경우 지수 백오프를 사용하는 HTTP 다시 시도에 대한 Polly 정책을 추가합니다.
보다 모듈화된 방식을 사용하려면 다음 코드에 표시된 대로 Program.cs 파일 내의 별도 방법으로 HTTP 재시도 정책을 정의할 수 있습니다.
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
이전 섹션에서 설명한 것처럼 표준 Program.cs 앱 구성에서 명명되거나 형식화된 클라이언트 HttpClient 구성을 정의해야 합니다. 이제 다음과 같이 지수 백오프를 사용하여 HTTP 다시 시도에 대한 정책을 지정하는 증분 코드를 추가합니다.
// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Set lifetime to five minutes
.AddPolicyHandler(GetRetryPolicy());
Polly를 사용하면 HTTP 예외(예: 오류 로깅)가 발생하는 경우 수행할 다시 시도 횟수, 지수 백오프 구성 및 작업이 포함된 재시도 정책을 정의할 수 있습니다. 이 경우 정책은 2초에서 시작하여 지수 다시 시도를 6회 시도하도록 구성됩니다.
재시도 정책에 지터 전략 추가
일반 재시도 정책은 동시성과 스케일링 성능이 높거나 경합이 많이 발생하는 경우 시스템에 영향을 미칠 수 있습니다. 부분 작동 중단 상황에서 여러 클라이언트로부터 유사한 재시도가 대규모로 발생하는 문제를 해결하려면 재시도 알고리즘/정책에 지터 전략을 추가하는 것이 좋습니다. 이 전략은 엔드투엔드 시스템의 전체 성능을 개선할 수 있습니다. Polly: Retry with Jitter(Polly: 지터를 사용한 재시도)에서 권장하는 것처럼, 지수 백오프에 대해 잘 제어되는 중앙값 초기 재시도 지연 시간이 적용된 원활하고 균등하게 분산된 재시도 간격으로 좋은 지터 전략을 구현할 수 있습니다. 이 접근 방식은 문제가 발생했을 때 급증을 분산하는 데 도움이 됩니다. 원칙은 다음 예제에서 확인할 수 있습니다.
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);
추가 리소스
패턴 다시 시도https://learn.microsoft.com/azure/architecture/patterns/retry
Polly 및 IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly(.NET 복원력 및 transient-fault-handling 라이브러리)https://github.com/App-vNext/Polly
Polly: 지터를 사용하여 다시 시도https://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. 지터: 임의성으로 더 효율적인 지터 만들기 https://brooker.co.za/blog/2015/03/21/backoff.html
.NET