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

이 콘텐츠는 eBook, 컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로 서비스 아키텍처에서 발췌한 것이며, .NET 문서에서 제공되거나 오프라인 상태에서도 읽을 수 있는 PDF(무료 다운로드 가능)로 제공됩니다.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

지수 백오프를 사용하는 다시 시도는 오픈 소스 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);

추가 리소스