gRPC는 2016년 Google에서 개발한 오픈소스 RPC 프레임워크이다.
- 전송을 위해 TCP/IP와 HTTP/2를 사용한다.
- IDL로는 Protocol Buffer를 사용한다.
gRPC가 무엇인지 좀 더 자세하게 이해하기 위해서는 왜 gRPC가 등장했는지에 대한 등장 배경을 이해해야 한다.
1️⃣ IPC (Inter Process Communication)
IPC는 프로세스 간에 통신을 가능하게 하는 메커니즘이다.
프로세스들은 메모리를 공유하지 않기 때문에 상호간의 정보를 공유하기 위하여 IPC의 기법 중 하나를 사용하여 통신을 하게 된다.
IPC 기법에는 Shared Memory, Pipe, 메시지 큐, Socket 등.. 여러가지 방법이 있다.
- 이 중 Socket 방법은 TCP, UDP를 이용하기 위한 수단이다.
- 목적지와의 통신이 온라인 범위에서 이루어지기 때문에 네트워크간 통신이라고 구분하기도 하지만, 실질적으로는 로컬 컴퓨터의 프로세스 ↔ 원격지 컴퓨터의 프로세스 끼리 서로 IPC 통신을 하는 것 이다.
💡 Socket 통신
IPC의 여러가지 방식 중 Socket 통신은 대부분의 언어에서 API 형태로 제공하여서 편리하다는 장점이 있어 많이 사용되고 있었으나 다음의 단점들이 존재했다.
단점
- 통신 과정을 직접 구현하기 때문에 통신 장애처리는 고스란히 개발자의 몫이 된다.
- 수백 수천가지 데이터가 돌아다니게 될 경우 Data Formatting이 어렵다.
2️⃣ RPC(Remote Procedure Call) 등장
Socket통신의 단점을 보완하기 위해 1980년에 RPC라는 기술이 등장하였다.
RPC는 이름 그대로 네트워크로 연결된 서버의 프로시저 (함수, 메서드 등)을 원격으로 호출할 수 있는 기능임.
- 통신이나 Call 방식에 신경쓰지 않고 원격지의 자원을 내 것처럼 사용할 수 있음.
💡 RPC의 통신 과정
- IDL (Interface Definition Language)를 사용하여 호출 규약을 정의함.
- IDL에는 함수명, 인자, 반환값에 대한 데이터형이 정의되어 있음.
- rpcgen으로 컴파일하면 Stub Code가 생성됨.
- Stub Code에 명시된 함수는 원시코드의 형태로, 상세 기능은 Server에서 구현된다.
- 만들어진 Stub Code는 클라이언트/서버에 함께 빌드한다.
- Client에서 Stub에 정의된 함수를 사용할 때 Client Stub은 RPC runtime을 통해 함수를 호출함.
- Server는 수신된 Procedure 호출에 대한 처리 후 결과 값을 반환한다.
- 최종적으로 Client는 Server의 결과값을 반환받고 함수를 Local에 있는 것 처럼 사용할 수 있음.
그러나 RPC 역시 다음의 단점들이 있어서 잘 사용하지 않게되었다.
단점
- 구현 하기가 어렵다.
- 지원 기능의 한계
- etc..
그래서 RPC 프로젝트도 점차 잊혀져갔고 데이터 통신을 익숙한 Web을 활용하는 시도로 이어짐.
3️⃣ REST (REpresentational State Transfer)등장
HTTP/1.1 기반으로 URI를 통하여 모든 자원을 명시하고 HTTP Method를 통하여 처리하는 아키텍쳐이다.
REST는 다음과 같은 장점으로 매우 보편화 되어 있다.
장점
- 자원 그 자체를 표현하기 때문에 직관적임.
- HTTP를 그대로 계승하여서 별도 작업없이도 쉽게 사용할 수 있음.
그러나 REST에도 한계가 존재한다.
단점
- REST는 일종의 스타일일뿐 표준이 아니여서 Parameter와 응답값이 명시적이지 않다.
- HTTP 메소드의 형태가 제한적이기 때문에 세부 기능 구현에는 제약이 있다.
- 웹 데이터 전달 시 xml, json 형식을 많이 사용하는데 xml과 json형식에 대한 단점들이 일부 존재함.
- 데이터를 전송하기 처리하기 위해서는 별도의 Serialization이 필요하다.
gRPC는 이런 REST의 한계점과 기존 모놀리식 구조에서 MSA의 아키텍쳐로 옮겨가게 되는 시기와 맞물려서 등장하게 된 것이다.
gRPC의 기능
1️⃣ ProtoBuf (Protocol Buffer)
Protocol Buffer는 Google에서 개발한 구조화된 데이터를 직렬화(Serializer)하는 기법이다.
*직렬화(Serializer) : 데이터 표현을 Byte단위로 변환하는 작업.
- ProtoBuf를 사용하게 되면 기존에 json, xml로 직렬화와 비교했을 때 Byte단위를 최소화 할 수 있다.
2️⃣ HTTP/2
REST와 비교 시 가장 큰 차이점 중 하나는 HTTP/2를 사용하는 것이다.
- HTTP/1의 단점
- HTTP/1.1은 기본적으로 클라이언트의 요청이 올때만 서버가 응답을 하는 구조라서 매 요청마다 connection을 생성해야 한다.
- 이는 곧, 무거운 header (cookie 등의 많은 메타 정보들을 저장하는)가 요청마다 중복 전달되어 비효율적이고 느린속도를 보여준다.
그러나 HTTP/2는 다르다!
- HTTP/2
- 하나의 connection으로 동시에 여러 개 메시지를 주고 받음.
- header를 압축하여 중복제거 후 전달하여서 1.1에 비해 훨씬 효율적임.
- 필요 시 클라이언트 요청 없이도 서버가 리소스를 전달할 수도 있음. (클라이언트 요청 최소화)
gRPC의 이점
그렇다면 gRPC는 어떤 이점들이 있을까?
1️⃣ 성능
- gRPC는 Protobuf를 사용하여 직렬화 및 역직렬화를 수행한다.
- 이는 REST 통신에서 사용하는 JSON 형태의 직렬화 및 역직렬화보다 빠르다.
- 또한 Protobuf에 HTTP/2를 결합하여 사용하기 때문에 HTTP/1에 비해 더욱 효율적인 통신을 할 수 있게되었다.
2️⃣ API-우선 방식
- Protobuf를 이용하여 기능을 개발하기 전에 API를 먼저 정의할 수 있기 때문에 개발팀이 병렬적으로 업무를 진행할 수 있다.
3️⃣ REST API 지원
- Protobuf로 정의된 API는 Envoyproxy나 gRPC-gateway 같은 Gateway를 통해 REST API로도 제공이 가능하다.
마치며
간략하게 gRPC의 등장배경과 gRPC의 기능 및 이점에 대해서 알아보았다. 다음에는 Go언어로 gRPC 통신을 실제로 구현해보겠다.
Reference
'Computer Science > Common' 카테고리의 다른 글
용량 표현 단위에 대하여 (KB, KiB, MB, MiB, GB, GiB...) (0) | 2023.02.15 |
---|---|
불변 인프라 (Immutable Infrastructure) (0) | 2022.05.18 |