[C#] Polly Nuget 패키지 - Fallback

참조


Fallback 이란

  • Fallback 이란 대체 라는 의미를 가지고 있습니다.
  • 몇 번을 다시 시도해도 요청이 실패하는 경우가 있습니다.
  • 대체 정책을 사용하면 일부 기본값을 반환하거나 관리자 호출, 시스템 확장 또는 서비스 다시 시작과 같은 작업을 수행할 수 있습니다.

시나리오

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

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

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


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 Fallback 내용 추가

  • 앞서, gRPC Client 프로젝트를 추가하였습니다.
  • 다음으로, 실제 gRPC Server 에 연결하여 메시지를 보내는 코드를 추가하겠습니다.
  • 여기서 Polly를 사용하여, 만약 Client 에서 Server 연결이 실패할 경우, 대체 문자인 Fallback result 가 출력되도록 코드 작성 진행하였습니다.
using Grpc.Core;
using Grpc.Net.Client;
using gRPCService;
using Polly;
using Polly.CircuitBreaker;

var policy = Policy<string>.Handle<RpcException>(r => r.StatusCode != StatusCode.OK)
    .FallbackAsync("Fallback result");

while (true)
{
    try
    {
        var result = await policy.ExecuteAsync(async () => await DoSomething());
        Console.WriteLine(result);

        return;
    }
    catch (BrokenCircuitException)
    {
        Console.WriteLine("The circuit breaker tripped and is temporarily disallowing requests. Will wait before trying again");
        await Task.Delay(TimeSpan.FromSeconds(15));
    }
    catch (RpcException)
    {
        Console.WriteLine("RpcException exception while sending request. Will try again.");
    }
}

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

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

    var greeter = await greeterClient.SayHelloAsync(greeterRequest);

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

    Console.WriteLine($"Successfully send request");

    return greeter.Message;
}

실행 결과

  • 실제로 Client 에서 gRPC Server 연결이 실패한 후, Fallback result 값이 출력되는지 확인하였습다.
  • 확인 결과, Fallback result 가 출력되는 것을 확인할 수 있습니다.
Fallback result
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY