[C#] Polly Nuget 패키지 - Fallback
- C#
- 2022. 4. 19. 17:46
참조
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
'C#' 카테고리의 다른 글
[C#] Polly Nuget 패키지 - PolicyWrap (0) | 2022.04.20 |
---|---|
[C#] Polly Nuget 패키지 - Timeout (0) | 2022.04.19 |
[C#] Polly Nuget 패키지 - Circuit Breaker (0) | 2022.04.18 |
[C#] Polly Nuget 패키지 - Retry (0) | 2022.04.18 |
[EF Core ]PostgreSQL JSONB 용량 테스트 (0) | 2022.04.14 |
이 글을 공유하기