티스토리 뷰

Architecture/Framework

[gRPC] gRPC 개념

GOD동하 2021. 7. 5. 15:44

 

gRPC란?

gRPC는 구글에서 만든 HTTP2 기반의 RPC 통신을 위한 프레임워크이다. 

Google에서 내부 RPC 통신을 위해 만들던 Stubby 프로젝트를 기반으로 표준화하여 오픈소스로 공개했다. 

이전에 구글에서 IDL (Identity Definition Language) 로 인터페이스를 정의하는 언어인 Protocol Buffer를 제공했는데 HTTP/2 에 이 Protobuf 를 기반으로 RPC 통신을 할 수 있다.

 

그럼 여기서 몇가지 선수 개념을 짚고 넘어가면,

 

1. RPC

RPC는 Remote Procedure Call의 약자로 Client-Server 환경에서 통신 개발을 편하게 하기 위해서 등장했다.

Client에서는 function call을 통해 호출하여 응답 받고, Server에서는 외부에서 온 요청을 받아 응답을 해주는 형태이다. 이름 그대로 원격 서버의 프로시저를 호출할 수 있는 메커니즘으로 아래 그림에서 가장 중요한 개념은 Compiler가 IDL의 정의를 해당 언어로 생성해준 중간 Layer인 Stub인데, 여기서 마샬/언마샬링 처리를 통해 데이터 통신을 한다.

2. HTTP/2

HTTP/2 의 큰 특징은 헤더 데이터 압축과 Multiplexing으로 인한 성능 향상이다.

HTTP/1버전대에서의 Connection 비용 문제, 이를 위해서 keep-alive를 하지만 요청에서의 병목 현상이 있었고 pipelining을 함으로써 1.1 버전의 형태가 됐었다.

그리고, HTTP/1.1 에서 HOL 문제를 Multiplexing으로 해결한게 HTTP2이다.

 

HOL (Head Of Line) Blocking 문제란?

pipeline을 통해서 응답이 오기 전 요청을 모두 보내놓지만, 그림에서 보듯이 첫번째 (Head) 요청의 응답이 오기 전까진 다음 응답이 오지 않는다. 이 때 첫 요청이 지연될 경우 다른 요청들은 blocking 되는 현상이다.

 

이를 해결한 것이 HTTP/2 이다.

 

3. Protocol Buffer

 

Protocol Buffer란?

IDL(Interface Definition Language) 로 정의된 데이터 구조를 Byte 형태로 직렬화하는 방식

 

기존에 아래와 같이 주고받는 메세지는 HTTP 기반의 JSON으로 통신을 했다면,

gRPC는 HTTP/2 기반의 Protocol Buffer로 통신함으로써 Byte 형태로 메세지를 주고받는다.

그럼 여기서 어떤 형식으로 인코딩 되는지 살펴보자.

메세지는 위와 같이 필드들로 구성되어 있고, 필드는 다시 Tag / Value로 이루어져 있다.

JSON으로 따지면 Property : Value 의 매핑이라고 보면 됨.

 

Tag는 다시 Field IndexType으로 이루어져 있는데, 아래 message 정의를 보면 string, int64와 같은게 Type이고 1, 2, 3번과 같은 값이 Field Index이다.

타입은 아래와 같다.

Type Meaning Used for
0 Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded 메세지s, packed repeated fields
3 Start group groups (deprecated)
4 End group groups (deprecated)
5 32-bit fixed32, sfixed32, float

 

여기서 보면 타입은 6개로 고정되어 있다. 이 6개를 binary 형태로 표현하면 3bit만 필요하다.

그래서 Type 은 3bit를 할당하고 나머지 bit는 Field Index에 할당을 해준다.

Tag를 위해 최소한으로 1byte를 할당해주며 Type을 위한 3bit 제외하고 나머지 5bit로 Field Index를 표시한다.

위 그림과 같이 string user_name = 1; 은 1번 인덱스이므로 00001 / string type은 2이므로 010 으로 인코딩 된다.

 

예를 들어, 위 메세지 정의와 데이터로 인코딩을 하게 되면 "userName" : "Martin" 은 아래와 같이 인코딩 된다. 이 경우 19 byte가 필요하다. 하지만 인코딩을 하게 되면..

Tag는 1byte로 표시되어 0a, 가변길이의 length를 1byte, 각각은 UTF-8로 인코딩 되어 8byte면 충분히 인코딩 된다.

 

 

gRPC의 장단점은 아래와 같다.

다음 포스팅에서 실제 개발에 대한 내용을 정리하겠다.

 

'Architecture > Framework' 카테고리의 다른 글

[gRPC] gRPC 서비스 개발  (0) 2021.07.05
[gRPC] grpcurl 설치 (for Windows)  (0) 2021.05.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함