gRPC란?

Hyunjun Jang·2022년 1월 2일
0

gRPC란?

gRPC는 google 사에서 개발한 오픈소스 RPC(Remote Procedure Call) 프레임워크이다. 이전까지는 RPC 기능은 지원하지 않고, 메세지(JSON 등)을 Serialize할 수 있는 프레임워크인 PB(Protocol Buffer, 프로토콜 버퍼)만을 제공해왔는데, PB 기반 SerizlaizerHTTP/2를 결합하여 RPC 프레임워크를 탄생 시켰다.
REST와 비교했을 때 기반 기술이 다르기에 특징도 많이 다르지만, 가장 두드러진 차이점은 HTTP/2를 사용한다는 것과 프로토콜 버퍼로 데이터를 전달한다는 점이다. 그렇기에 Proto File만 배포하면 환경과 프로그램 언어에 구애받지 않고 서로 간의 데이터 통신이 가능하다.


  • HTTP/2
    http/1.1은 기본적으로 클라이언트의 요청이 올때만 서버가 응답을 하는 구조로 매 요청마다 connection을 생성해야 한다. cookie 등 많은 메타 정보들을 저장하는 무거운 header가 요청마다 중복 전달되어 비효율적이고 느린 속도를 보였다. 이에 http/2에서는 한 connection으로 동시에 여러 개 메시지를 주고 받으며, header를 압축하여 중복 제거 후 전달하기에 version1에 비해 훨씬 효율적이다. 또한, 필요 시 클라이언트 요청 없이도 서버가 리소스를 전달할 수도 있기 때문에 클라이언트 요청을 최소화 할 수 있다.
  • ProtoBuf (Protocol Buffer, 프로토콜 버퍼)
    Protocol Buffer는 google 사에서 개발한 구조화된 데이터를 직렬화(Serialization)하는 기법이다.
    직렬화란, 데이터 표현바이트 단위로 변환하는 작업을 의미합니다. 아래 예제처럼 같은 정보를 저장해도 text 기반인 json인 경우 82 byte가 소요되는데 반해, 직렬화 된 protocol buffer는 필드 번호, 필드 유형 등을 1byte로 받아서 식별하고, 주어진 length 만큼만 읽도록 하여 단지 33 byte만 필요하게 된다.

HTTP/1.1 vs HTTP/2

  • HTTP/1.1은 플레인 텍스트를 주고 받는 request - response 모델을 사용한다.

  • HTTP/2은 HTTP/1.1과 동일한 시멘틱을 공유하지만 (e.g. GET, POST 와 같은 메서드 / 헤더와 바디로 구성된 메세지 포맷 등) 메세지를 바이너리로 인코딩해서 주고 받는다는 커다란 차이가 있다.

  • HTTP/1.0의 경우 매번 새로운 리퀘스트에 대해서 TCP 커넥션을 새로 만들어야 했으므로 시간과 리소스를 더 소비했다. 이에 비해 HTTP/1.1은 지속적인 연결(persistant connection)을 가능하게 해서 하나의 TCP 커넥션이 유지된 채로, 응답을 기다릴 필요 없이 여러 개의 리퀘스트를 보낼 수 있다.

    • HTTP/1.1은 1.0에 비해 성능을 향상시켰지만 여전히 latency 이슈가 있다. 하나의 커넥션에 여러 개의 요청을 보낼 때, 이 요청들을 queue에 관리하므로 queue의 헤드 요청이 오래 걸리는 경우 뒤에 있는 요청들은 블로킹되는 병목현상이 나타난다. 이를 head-of-line(HOL) blocking 이라고 부른다.

    • 병렬적으로 여러 개의 TCP 커넥션을 만들면 이 문제를 완화할 수는 있지만, 클라이언트와 서버 사이에 동시에 유지할 수 있는 TCP 커넥션의 수가 제한되어 있을 뿐더러 TCP 커넥션을 새로 만들 때마다 추가적으로 리소스가 든다. (e.g. TCP handshake)

  • 반면 HTTP/2 는 하나의 TCP 연결이 여러 개의 양방향 스트림(bidirectional streams)을 지원한다. 하나의 커넥션은 여러 개의 스트림으로 구성되고, 각 스트림들은 여러 개의 메세지들(req-res 관계에서 주고 받는 포맷)로 구성되며 각 메세지들은 또 여러 개의 프레임으로 구성된다. 프레임들은 바이너리로 인코딩돼 있는 작은 단위이며, 특정 스트림에 속해 있다는 태그를 달고 있다. 이 식별 태그들은 커넥션이 인터리빙할 수 있게 해주고 결과적으로 블로킹 없이 여러 개의 요청-응답을 가능하게 한다. 즉 새로운 연결을 만들지 않고도 여러 개의 메세지가 병렬적으로 동시에 보낼 수 있는데 이를 Multiplexing 이라고 한다

Reference

https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC%88%A0-%EA%B2%BD%ED%97%98-%EC%8B%9C%EB%8C%80%EC%9D%98-%ED%9D%90%EB%A6%84-grpc-%EA%B9%8A%EA%B2%8C-%ED%8C%8C%EA%B3%A0%EB%93%A4%EA%B8%B0-1-39e97cb3460
https://meetup.toast.com/posts/261
https://alledy.netlify.app/posts/rest-vs-grpc/

profile
Let's grow together😊

0개의 댓글