[C#] Polly Nuget 패키지 - Retry

참조


Polly 란?

  • Polly 패키지는 재시도, 시간 초과 등에 유연하고 스레드로부터 안전한 방식으로 표현할 수 있게 해주는 .NET 복원력 및 일시적인 오류를 처리해주는 라이브러리입니다.

시나리오

  • C# 으로 gRPC Server/Client 서비스를 생성하고 간단하게 로직을 구현합니다.

  • 여기서, Client 에서 Server 의 접속 정보를 다르게 하여 RpcException 이 발생하도록 합니다.

  • 실제 RpcException 에러가 발생 하였을 때, Polly 가 RpcException 에러를 감지하고 실제로 Retry 를 진행하는지 테스트 진행합니다.


Polly NuGet Package 설치

  • 먼저, C# Project 에 Polly NuGet Package 설치 진행합니다.

PMC 명령어 설치

  • NuGet Package Manager Command 로 설치할 경우, 다음 명령어로 설치 진행 가능합니다.
Install-Package Polly

NuGet Package 설치

  • Polly 검색후, 다음 아이콘으로 생긴 NuGet 을 설치 진행합니다.

    참고로, Polly 는 gRPC 프로젝트에서 Client 프로젝트에 설치 하였습니다. 저는 Client 에서 Server 의 접속이 끊어졌을 경우 테스트 하였기 때문에 Polly 패키지를 Client에 추가하였습니다.


Server 프로젝트 생성

  • gRPC Server 프로젝트는 ASP.NET Core gRPC 서비스 프로젝트로 생성하였습니다.
  • ASP.NET Core gRPC 서비스 프로젝트를 생성하게 되면, 기본으로 Protos 파일이 생성이 되고, 해당 디렉토리 안에 greet.proto 파일이 생성됩니다.
  • 또한, GreeterService.cs 클래스가 자동으로 생성되며, 해당 클래스 안에는 gRPC 서버 로직이 구현되어 있습니다.
  • 해당 프로젝트 생성 과정은 생략 하도록 하겠습니다.

Client 프로젝트 생성

  • Client 프로젝트는 콘솔 프로젝트 로 생성하였습니다.
  • 그리고 다음 3가지의 NuGet Package 를 설치 하였습니다.
    • Google.Protobuf
    • Grpc.Net.Client
    • Grpc.Tools
  • 위 3개의 NuGet Package를 설치 진행 되어야 gRPC 통신을 진행할 수 있습니다.

Client 프로그램에 Polly Retry 내용 추가

  • 앞서, gRPC Client 프로젝트를 추가하였습니다.
  • 다음으로, 실제 gRPC Server 에 연결하여 메시지를 보내는 코드를 추가하겠습니다.
  • 여기서 Polly를 사용하여 만약, Client 에서 Server 연결이 실패할 경우 Retry 하는 코드까지 함께 추가하여 작성해 보도록 하겠습니다.
using Grpc.Core;
using Grpc.Net.Client;
using gRPCService;
using Polly;

var polly = Policy
           .Handle<RpcException>()
           .RetryAsync(3, (exception, retryCount, context) =>
           {
               Console.WriteLine($"try: {retryCount}, Exception: {exception.Message}");
           });

var result = await polly.ExecuteAsync(async () => await DoSomething());

/// <summary>
/// gRPC Server 에게 메시지 보내기
/// </summary>
static async Task<string> DoSomething()
{
    var channel = GrpcChannel.ForAddress("https://localhost:7244");
    var greeterClient = new Greeter.GreeterClient(channel);

    var greeterRequest = new HelloRequest { Name = "Beom" };

    var greeter = await greeterClient.SayHelloAsync(greeterRequest);

    Console.WriteLine($"{greeter.Message}");

    return greeter.Message;
}
  • 실제 gRPC Server의 주소는 https://localhost:7243 이지만, Port 를 7243 -> 7244 로 바꿔서 gRPC Client 에서 Server 로 접속 요청을 하도록 하였습니다.
  • 그럼 당연히, 없는 주소이기 때문에 접속은 실패합니다.
  • Polly Retry 함수를 이용하여 최대 3회 까지 접속하도록 설정 하였고, 요청 마다 에러 메시지 기록하도록 하였습니다.
  • 실제로 프로그램 실행하여, Retry 진행 되는지 테스트 진행하였습니다.

실행 결과

  • 실제 프로그램 실행 결과, 총 3회의 Retry 시도 끝에 최종적으로 Retry 횟수가 초과되어 연결 실패된 것을 확인할 수 있습니다.


Retry 중간에 Server 가 실행 된 경우

  • 이번에는 Client 가 정상적으로 Server 주소인 https://localhost:7243 포트에 연결 요청을 한다고 가정합니다.
  • 하지만, 아직 Server 가 실행되지 않고 Client 가 먼저 실행된 상태입니다.
  • 여기서, Client 가 2번째 Retry 까지 요청 했을 때 Server 가 실행되어 3번째에는 gRPC 메시지가 Server 로부터 정상적으로 반환되어 출려되는지 테스트 진행하였습니다.
  • 테스트 진행 결과, Retry 2회까지는 Server 가 실행되지 않아 연결 실패 했지만, 3번째 Retry 때 Server 가 정상 실행되어 Hello Beom 메시지가 Server 로부터 반환되어 Client 가 정상적으로 출력한 것을 확인할 수 있습니다.

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY