Microsoft .NET/C#

[C#] HttpClient 재시도, IHttpClientFactory와 표준 리질리언스 정책

전자기린 2026. 11. 10. 00:50

외부 API 호출이 가끔 실패할 때 재시도는 필수입니다. .NET 8에서는 Microsoft.Extensions.Http.Resilience로 표준화된 정책을 붙일 수 있습니다.

절차

  1. 패키지 설치
  2. IHttpClientFactory 등록
  3. 정책 세부 조정
  4. 직접 구현하는 경우

 

1. 패키지

dotnet add package Microsoft.Extensions.Http.Resilience

2. 기본 등록

builder.Services.AddHttpClient("api", c =>
{
    c.BaseAddress = new Uri("https://api.example.com");
    c.Timeout = TimeSpan.FromSeconds(10);
})
.AddStandardResilienceHandler();

AddStandardResilienceHandler()는 재시도·타임아웃·서킷브레이커·동시성 제한을 한 번에 붙입니다. 기본값은 지수 백오프 3회 재시도입니다.

3. 정책 세부 조정

.AddStandardResilienceHandler(o =>
{
    o.Retry.MaxRetryAttempts = 2;
    o.Retry.UseJitter = true;
    o.Retry.ShouldHandle = args => ValueTask.FromResult(
        args.Outcome.Result?.StatusCode is HttpStatusCode.RequestTimeout
            or HttpStatusCode.TooManyRequests
            or >= HttpStatusCode.InternalServerError);
});

4. 직접 구현하는 경우

패키지 없이 짧게 감싸는 방법도 있습니다. 단, POST처럼 중복 실행이 위험한 요청에는 멱등 키를 꼭 붙입니다.

for (int i = 0; i < 3; i++)
{
    try
    {
        return await client.GetStringAsync(url, ct);
    }
    catch (HttpRequestException) when (i < 2)
    {
        await Task.Delay(TimeSpan.FromMilliseconds(200 * Math.Pow(2, i)), ct);
    }
}

정리

  1. 재시도는 IHttpClientFactory 등록에 붙여 한 곳에서 관리
  2. 4xx는 재시도하지 않는다 — 408·429·5xx만
  3. POST는 멱등 키 없이 재시도하지 않는다