다음을 통해 공유


IHttpClientFactory 및 Polly 정책을 사용하여 지수 백오프를 사용하여 HTTP 호출 재시도 구현

팁 (조언)

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.

컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로서비스 아키텍처 eBook의 표지 썸네일.

지수 백오프를 사용하여 다시 시도하려면 오픈 소스 Polly 라이브러리와 같은 고급 .NET 라이브러리를 활용하는 것이 좋습니다.

Polly는 복원력 및 일시적인 오류 처리 기능을 제공하는 .NET 라이브러리입니다. 재시도, 회로 차단기, 벌크헤드 격리, 시간 제한 및 대체와 같은 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 패키지를 사용하는 것이 좋습니다. 확장 패키지도 참조해야 하는 경우가 일반적입니다.

앱 시작 시 Polly의 재시도 정책을 사용하여 클라이언트 구성

AddPolicyHandler() 메서드는 사용할 개체에 HttpClient 정책을 추가하는 것입니다. 이 경우 지수 백오프를 사용하여 Http 재시도에 대한 Polly의 정책을 추가합니다.

더 모듈식 접근 방식을 사용하려면 다음 코드와 같이 http 재시도 정책을 Program.cs 파일 내의 별도 메서드에 정의할 수 있습니다.

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: Jitter를 사용하여 다시 시도하는 경우, 지수 백오프에서 잘 설정된 초기 재시도 지연과 원활하게 고르게 분산된 재시도 간격을 적용하여 효과적인 지터 전략을 구현할 수 있습니다. 이 방법은 문제가 발생할 때 급증을 분산하는 데 도움이 됩니다. 이 원칙은 다음 예제에서 설명합니다.


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

추가 리소스