develop/etc

gRPC

아르르르를를르 2022. 7. 21. 23:15

무엇인가?

Google에서 개발한 RPC(Remote Procedure Call) 시스템

전송을 위해 TCP/IP 프로토콜과 HTTP 2.0 프로토콜 사용

IDL(Interface Definition Language)로 ProtoBuf 사용

 

어떨 때 사용하나?

최근 많은 회사에서 MSA구조로 서비스를 개발하고 있다. MSA 단점 중 하나로 동일 머신에 존재하지 않는 분리된 모듈끼리의 네트워크 통신 overhead 이슈가 있는데 이에 REST API 대신 gRPC를 도입하는 것으로 해결한다고 한다. 어떻게 해결하는지 알아보도록 한다.

 

HTTP 2.0 프로토콜

HTTP1.1 은 기본적으로 client가 server로 요청을 보내고 응답을 받는 구조이다. 요청 단위가 client와 server를 왕복하고, cookie를 포함한 header 크기까지 있어 통신이 느리다.

HTTP 2.0 은 API 작동 방식은 동일하게 유지하고 밑단의 전달 방식을 개선하여

header 정보를 HPACK 방식으로 압축하고,

요청마다 새로운 connection을 생성하는 것이 아니라 1개의 connection으로 동시에 여러 메시지를 주고 받을 수 있고 (요청 및 응답 다중화),

client 요청 없이도 server가 리소스를 보낼 수 있고,

요청에 우선순위 선정이 가능하여 중요한 리소스 먼저 받을 수 있다.

https://web.dev/performance-http2/

gRPC는 HTTP 2.0을 사용하여 통신 속도가 빠르고 on-connection 상태에서 비동기 통신 구현이 용이하다.

(참고로 소켓 방식과 HTTP 방식 차이도 알아두도록 하자)

 

gRPC protobuf

protobuf를 알아보기 전에 REST API에서 가지고 있던 이슈 2가지를 먼저 보도록 한다.

 

REST API 이슈

1) JSON Payload

JSON은 데이터 구조를 쉽게 표현할 수 있고, 사람이 읽기에도 좋은 표현 방식이다.

그러나 이 말은 곧 기계 입장에선 Serialization, Deserialization의 변환 과정이 필요하다는 의미다.

 

2) API Spec 정의 및 문서 표준화 부재

보통 REST API를 개발할 때 RESTful하게 개발하자는 이야기를 많이 하지만 아직 명확하게 정해진 표준이 없어 커뮤니케이션과 API 명세서가 필요하다. 또한 JSON은 String 형식이므로 type을 지원하지 못한다.

 

grpc는 JSON이 아닌 ProtoBuf를 IDL 및 기본 메시지 교환 포맷으로 사용하여 Stub을 주고받는다.

https://grpc.io/docs /what-is-grpc/introduction/

Protocol Buffer는 Google이 공개한 데이터 구조로, 특정 언어 혹은 플랫폼에 종속적이지 않은 데이터 표현 방식이다. ProtoBuf를 언어에서 독립적으로 사용해야 하기 위해 Stub 클래스를 생성해야 한다. Java나 Kotlin에서는 Stub을 자동으로 생성해주는 라이브러리가 있다. grpc 라이브러리는 빌드 시점에 Proto 파일을 찾고 컴파일 단계에서 Stub 클래스를 자동으로 생성한다. 그 후 해당 클래스 정보를 server와 client에 공유한 다음, Stub 클래스를 활용하여 양방향 통신을 수행할 수 있다. 

https://cla9.tistory.com/175?category=993774

따라서 ProtoBuf를 사용하면 

1) 데이터 타입 제약이 가능하고,

2) API 문서가 필요없어 REST 표준화 부재의 문제를 해결하고,

3) Stub을 Binary형태로 주고받으므로 필드값이 필요없어 payload 크기도 상당히 적어

대규모 트래픽 환경에서 성능상 유리하다.

 

단점은?

1) 제한된 브라우저 지원

HTTP 2.0을 사용하므로 Envoy와 같은 Proxy 서버를 통해 요청을 포워딩 해야 한다.

 

2) JSON과 같이 사람이 읽을 수 없음

 

3) Stub 관리 비용 추가

요구사항 변경으로 인해 Stub 클래스 변경이 필요할 때 Server에서 변경한 내용을 Client에서도 적용을 해야 한다. 그래서 가장 많이 사용하는 방법으로는 Proto 파일을 중앙에서 gitops 형식으로 관리하고 변경이 생겼을 때 이를 감지하고 언어별로 컴파일하여 Stub 클래스를 라이브러리 형태로 배포하는 방법을 많이 사용한다고 한다.

 

따라서 간단한 REST API를 제공하는 서비스 개발에는 적합하지 않다.

 

참고

https://tecoble.techcourse.co.kr/post/2021-09-20-http2/

https://cla9.tistory.com/175?category=993774

https://eocoding.tistory.com/87

https://docs.microsoft.com/ko-kr/aspnet/core/grpc/comparison?view=aspnetcore-6.0 

'develop > etc' 카테고리의 다른 글

udemy 클린코드 강의 정리  (0) 2022.08.09
실행계획 explain  (0) 2022.07.12
REST API  (0) 2022.07.09
[vscode] java language server requires a JDK 11+ to launch itself  (0) 2022.02.14
개발자 포트폴리오 잘 만들기  (0) 2021.11.03