삭제 대신 reserved를 쓰고 생성된 client/server 코드가 같은 계약을 보게 한다.
NestJS gRPC
gRPC 통신은 proto 계약, deadline, status code가 한 경로로 검증된다
gRPC 호출은 함수 호출처럼 보이지만 실제 운영에서는 proto 호환성, client stub 설정, metadata, deadline 예산, status code 매핑이 같은 trace 안에서 맞아야 한다.
proto에서 handler까지 책임 지도
proto → stub → handler → statuspackage, protoPath, url, service 이름이 양쪽에서 같은지 확인한다.
요청 ID, 인증 컨텍스트, deadline을 trace 안에서 함께 추적한다.
INVALID_ARGUMENT, NOT_FOUND, UNAVAILABLE, DEADLINE_EXCEEDED를 구분한다.
proto 계약 검증
compatibility
필드 번호는 wire format의 실제 주소
이름만 바꾼 변경과 번호 재사용은 영향 범위가 다르다.
reserved 7;
service 이름과 package가 stub 연결 키
package/protoPath/url 불일치는 런타임 UNIMPLEMENTED로
보인다.
hero.HeroService
도메인 실패와 통신 실패를 분리
validation은 INVALID_ARGUMENT, 일시 장애는 UNAVAILABLE에
가깝다.
RpcException
호출자 예산을 서버 작업에 전달
DB query와 downstream 호출이 남은 시간을 넘지 않게
자른다.
metadata
Status 판단
same trace, different cause
검증 질문
gRPC 운영 품질은 양쪽 코드가 같은 계약과 같은 시간 예산을 보는지로 확인한다.
- proto 변경이 client stub과 server handler contract test를 동시에 통과하는가?
- deadline, requestId, user context가 metadata와 로그에 같은 값으로 남는가?
- status code별 retry 가능성과 idempotency 기준이 문서와 테스트에 있는가?