[C#] Polly Nuget 패키지 - Retry
- C#
- 2022. 4. 18. 21:03
참조
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
'C#' 카테고리의 다른 글
[C#] Polly Nuget 패키지 - Fallback (0) | 2022.04.19 |
---|---|
[C#] Polly Nuget 패키지 - Circuit Breaker (0) | 2022.04.18 |
[EF Core ]PostgreSQL JSONB 용량 테스트 (0) | 2022.04.14 |
[EF Core] EF Core & PostgreSQL Column JSONB 타입 데이터 추가 (0) | 2022.04.13 |
[C#] Npgsql NuGet Package 이용하여 PostgreSQL 연동하기 (0) | 2022.04.11 |
이 글을 공유하기