티스토리 뷰

golang

gRPC Error in Golang

주먹불끈 2019. 6. 27. 19:46


Photo by Luke McKeown on Unsplash


참고링크

 

- 공식 페이지: https://www.grpc.io/docs/guides/error/

- 실습 코드: https://github.com/avinassh/grpc-errors/tree/master/go

- Errors: https://cloud.google.com/apis/design/errors

- 좋은 참고: http://avi.im/grpc-errors/

- 유데미

- 강좌: https://www.udemy.com/grpc-golang/learn/lecture/11018812#overview

- 실습: https://www.udemy.com/grpc-golang/learn/lecture/11018814#overview

 

 

gRPC call 실패 - Standard error model

 

gRPC call 실패하면 에러코드와 (옵션) 에러 문자열을 리턴해준다.

여기까지는 모든 gRPC 서버/클라이언트 라이브러리에서 지원된다. - protocol buffers 쓰는지 여부와는 상관 없다.

 

하지만 만약에 Protocol buffers 쓴다면? - Richer error model

 

구글이 만든 Richer error model 있다.

- 링크: https://cloud.google.com/apis/design/errors

- 하나 이상의 protobuf 메시지로 좀더 자세한 오류 정보를 서버 클라이언트로 전달한다.

- 시점 C++, Go, Java, Python, Ruby 에서 있음

 

주의점

 

1) 언어별로 구현이 다를 있다.

2) 프록시, 로거 또는 다른 스탠다드 HTTP request 프로세서에서는 에러 내부를 없다.

3) HTTP/2 헤더 압축 효율을 저하시킬 있다. cache missing 자주 일어나기 때문이라함

4) 너무 error detail payload protocol limits 걸려서 오히려 original error 잘려버릴 수도 있다.

 

Error status code

 

아래에 보다시피 중복되는 Status code 들도 있어서, 실제 지원하는 Status code 무척 적다. 8

 

GRPC_STATUS_CANCELLED

GRPC_STATUS_DEADLINE_EXCEEDED

GRPC_STATUS_UNIMPLEMENTED

GRPC_STATUS_UNAVAILABLE

GRPC_STATUS_UNKNOWN

GRPC_STATUS_INTERNAL

GRPC_STATUS_RESOURCE_EXHAUSTED

GRPC_STATUS_UNAUTHENTICATED

 

 

일반적 에러


네트워크 문제

 

프로토콜 문제

 

간단한 Golang 코드 예제

 

링크: http://avi.im/grpc-errors/

 

1) 서버에서  에러를 생성해서 보내준다.

 

- status.Errorf() 함수를 이용해서 code message 보내주면 된다.

- 아래 예시에서는

- code codes.InvalidArgument 이고

- message "Ouch!" 이다.

 

2) Client 리턴된 err 에서 상세 정보를 찾을 있다.

 

- 생성해둔 client.GRPCMethod() 실행시켰는데 원하는 값은 안오고 err 리턴됨

- 이때 status.FromError(err) 통해 원하는 정보를 추출해낼 있다.

 

실제 Golang 예제를 따라해 보자

 

참고 링크: https://github.com/avinassh/grpc-errors/tree/master/go

구현 링크https://github.com/nicewook/grpc-error

 

.proto

 

Server

 

1) serve() 함수 - gRPC 서버를 구동시키는 부분은 설명 생략

2) 서버의 rpc 함수인 Sqrt() 호출되면

- req 통해 들어온 값을 in 집어넣고 에러체크를 한다

- 50보다 크거나, 0보다 작으면 각각 거기에 맞는 에러를 회신해주는데

- status.Errorf() 함수를 이용하면 code message 받아서 error 타입으로 바꿔준다.

클라이언트는 다시 error 타입을 status 바꿔줄 것이다.

 


 

Client

 

- 클라이언트는 호출한다.

- 10 정상적인 값을 회신 받을 것이고

- 100 50보다 커서 에러가 발생할 것이며

- -2 경우는 음수라서 에러가 발생할 것이다.

 

- sendReq() 함수를 실행하면 실제적으로 client rpc 함수인 Sqrt() 실행한다.

- 만약 에러가 발생하였다면 (err != nil)

1) 그것을 status.FromError() 함수를 이용해 *Status ok 라는 bool 리턴 받는다.

2) 만약 grpc 에러라면 ok == true 일것이고, 아니라면 치명적 에러일 가능성이 높다.

3) grpc 에러일때는 Code(), Err(), Message() 모두 출력해보았다. Details() 넣어 보낸게 없기 때문에 비어있다.

 

실행 결과

 

실행 되었다.

 

Errors

 

링크: https://cloud.google.com/apis/design/errors

 

구글 API 에서 쓰는 에러 모델을 살펴보자.

- 에러를 어떻게 생성하고, 어떻게 다룰 것인가?

 

Protocol-agnostic error model

 

- 프로토콜을 불문하고  = 어떤 프로토콜이든 상관없이 있다는 것이다.

- gRPC, HTTP 등등

 

에러 모델

 

에러 모델은 아래와 같이 정의되어 있다.

에러 발생시에 이런 인스턴스가 클라이언트에게 리턴되는 것이다.

 

링크: https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto

간단하게만 흝어본다. 자세한 것은 링크 참조

 

 

에러 코드, 에러 메시지, 에러 디테일 개로 이루어져 있다.

 

1) 에러 코드

 

링크: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto

여기에 명시된 이상을 사용할 없다. 보통은 API 하나에 에러 처리 3 이상을 하지 않을 것이다.

 

2) 에러 메시지

 

- 아이도 이해하기 쉽게, 짧게 쓸것

- 기술자가 읽는다면 대응하기 쉽게 쓸것

- 필요하다면 관련 링크도 좋겠다.

 

3. 에러 디테일

 

링크: https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto

필요하다면 링크와 같은 표준 에러 payload 추가할 있다. ( 예제에서는 사용하지 않았다)

 

반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함