티스토리 뷰
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 Index 와 Type으로 이루어져 있는데, 아래 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
- DP
- 블록체인
- Spring
- k8s
- excel parsing
- 아키텍처
- 동적계획법
- Java
- SpringBoot
- 알고리즘
- Nealford
- Bruteforce
- 백준
- Vue.js
- Bitcoin
- white paper
- kubernetes
- 스프링 시큐리티
- 비트코인
- Blockchain
- CARDANO
- leetcode
- 암호화폐
- gRPC
- 스프링
- 카르다노
- 사토시 나가모토
- Redis
- vuejs
- architecture
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |