tech/network

gRPC 프로토콜

daniel_lab 2024. 10. 24. 23:24

현재 회사에서 구축한 서버의 네트워크 프로토콜로 gRPC 를 사용하고 있다. 오늘은 gRPC와 관련된 기술의 여러측면을 정리해보려 한다.

 

서버 통신프로토콜로 gRPC를 채택한 이유

우선 회사에서 gRPC를 통신프로토콜로 채택한 이유는 대표적으로 아래와 같다.

1. 어떤 클라이언트 언어를 사용하더라도 protoc 로 간단하게 요청/응답/API호출메소드 등을 코드로 생성할 수 있다. 이렇게 되면 서버와 통신하는 모든 코드를 type safety 한 방식으로 작성할 수 있기 때문에(당연히 모든 객체, 필드들 자동완성까지 함께) 개발 생산성이 올라간다.

2. protobuf 파일만 공개하면 어떤 클라이언트에서도 해당서버와 자유롭게 연결할 수 있다.

3. 요청/응답의 단방향 통신에 더하여 클라이언트 스트리밍, 서버 스트리밍, 양방향 스트리밍 등 다양한 방식의 통신을 쉽게 구현할 수 있다.

 

gRPC 와 HTTP/2

gRPC는 HTTP/2 프로토콜을 기반으로 동작하며, 각 정보는 HTTP/2의 특정 부분에 실린다. gRPC의 요청과 응답은 HTTP/2 프레임을 통해 전송되며, 이를 통해 클라이언트와 서버 간의 통신이 이루어진다. gRPC는 HTTP/2의 헤더, 본문(body), 트레일러를 모두 사용해 데이터를 주고받는다. 각 정보가 HTTP/2에서 어떻게 표현되는지는 다음과 같다.

1. HTTP/2 헤더 프레임

gRPC 메타데이터는 HTTP/2의 헤더 프레임에 실린다.

  • HTTP/2 헤더에는 요청 및 응답의 메타데이터가 포함된다. 이는 gRPC 메서드와 호출의 맥락을 제공한다.
  • gRPC 요청 시, HTTP/2 헤더 프레임에는 다음과 같은 필드들이 포함된다:
    • :method: POST: HTTP 메서드로 POST가 사용된다.
    • :path: /[서비스명]/[메서드명]: 호출하려는 gRPC 메서드의 경로가 들어간다.
    • :scheme: http 또는 https: HTTP/2 통신에 사용되는 스킴이다.
    • content-type: application/grpc: gRPC 메시지가 전송된다는 것을 나타내는 필드다.
    • grpc-timeout: 호출이 제한되는 시간(타임아웃)을 설정할 수 있다.
    • 그 외에 사용자가 정의한 메타데이터가 gRPC 요청에 포함될 수 있다.

서버 응답 시에도 비슷한 헤더 프레임이 사용된다. 응답이 정상적으로 이루어졌을 경우 :status: 200과 같은 HTTP 상태 코드가 포함된다.

2. HTTP/2 데이터 프레임

gRPC 메시지 본문은 HTTP/2의 데이터 프레임에 실린다.

  • gRPC의 요청 본문과 응답 본문은 프로토콜 버퍼(Protobuf)로 직렬화된 데이터가 전송된다. 이는 바이너리 데이터로 HTTP/2 데이터 프레임을 통해 실린다.
  • 각 메시지는 5바이트의 gRPC 프레임 헤더로 시작하며, 그 다음에 실제 데이터가 온다.
    • 첫 1바이트는 메시지 압축 여부를 나타내는 플래그다. 0은 압축되지 않음을 의미한다.
    • 나머지 4바이트는 메시지의 길이를 나타낸다.
    • 이후 실제 메시지 본문 데이터가 이어진다.

서버와 클라이언트 간의 데이터는 HTTP/2의 데이터 프레임을 통해 주고받는다. gRPC는 스트리밍을 지원하므로, 하나의 HTTP/2 연결에서 여러 개의 데이터 프레임이 순차적으로 전송될 수 있다.

3. HTTP/2 트레일러 프레임

gRPC 상태 코드 및 오류 메시지는 HTTP/2의 트레일러 프레임에 실린다.

  • 응답이 완료된 후, gRPC는 추가 정보를 트레일러에 담아 전송한다. 트레일러는 본문 데이터가 모두 전송된 후에 나타난다.
  • 주요 트레일러 필드는 다음과 같다:
    • grpc-status: gRPC 호출의 최종 상태 코드를 나타낸다. 예를 들어, 성공적인 경우 0이 설정되고, 오류가 발생한 경우 오류 코드를 나타낸다.
    • grpc-message: 상태 코드와 관련된 설명 또는 오류 메시지를 담는다.
    • 기타 추가적인 메타데이터를 트레일러에 포함시킬 수 있다.

이 트레일러들은 HTTP/2 트레일러 헤더로 전송되며, 클라이언트는 응답의 최종 상태를 이 트레일러에서 확인한다.

'tech > network' 카테고리의 다른 글

websocket 내부 동작 정리 & signalr  (0) 2023.10.26