티스토리 뷰
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 를 추가할 수 있다. (위 예제에서는 사용하지 않았다)
'golang' 카테고리의 다른 글
gRPC SSL/TLS 2. SSL/TLS 에 대하여 (0) | 2019.07.01 |
---|---|
gRPC SSL/TLS 1. 암호에 대하여 - 대칭키, 비대칭키, 해시 알고리즘 (0) | 2019.07.01 |
gRPC Deadline (0) | 2019.06.26 |
Golang 개발시 Makefile 사용해보기 (0) | 2019.06.24 |
Maximum Subarray Problem (0) | 2019.06.19 |
- Total
- Today
- Yesterday
- 2023
- 제이펍
- 인텔리제이
- OpenAI
- strange
- postgres
- 독서
- Bug
- intellij
- pool
- 독서후기
- golang
- 잡학툰
- ChatGPT
- solid
- websocket
- 영화
- agile
- 체호프
- bun
- 클린 애자일
- folklore
- API
- Gin
- 노션
- Shortcut
- notion
- go
- github
- JIRA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |