gRPC는 무엇인가

 

안녕하세요, 요즘 gRPC에 대해서 관심이 많이 생기고 다양한 회사의 채용 공고 중 gRPC와 관련된 부분이 있어서 “gRPC는 무엇인가”에 대해서 궁금증이 생겨서 글로 만들어서 작성해 두면 좋을 것 같아서 작성해 봅니다.

배경지식

gRPC(Google Remote Procedure Call)을 알기 위해서는 배경 지식이 필요합니다.
간단하지만 조금 어려운 배경지식에 대해서 이야기하고 진정으로 gRPC가 무엇인지에 대해서 이야기 해 보겠습니다.

RPC(Remote Communication Mechanism)

RPC(원격 프로시저 호출)는 한 프로그램이 네트워크의 세부 정보를 이해하지 않고도 네트워트 안의 다른 컴퓨터에 있는 프로그램에서 서비스를 요청하는 프로토콜입니다. RPC는 Clinet-Server 모델을 사용하고 있으며 클라이언트에서 서비스를 요청(Function Call)하면, 서버에서 서비스를 제공하는 모델입니다.

RPC Diagram

HTTP 프로토콜

HTTP(Hypertext Transfer Protocol)는 웹에서 쓰이는 통신 프로토콜입니다. 그럼 프로토콜은 뭘까요? 프로토콜은 상호간에 정의한 규칙을 의미합니다.

HTTP 프로토콜은 TCP/IP 프로토콜 위의 레이어(Application layer)에서 동작합니다.

OSI 7 layer and TCP/IP Model

HTTP 프토콜은 stateless 프로토콜입니다. 상태가 없다는 의미는 데이터를 주고 받기 위한 각각의 데이터 요청이 서로 독립적으로 관리된다는 의미이며, 이전 데이터 요청과 다음 데이터 요청이 서로 관련 없습니다.

HTTP는 기본적으로 Server-Client 구조를 따르고 있습니다.
웹 개발을 해 보신 분들은 기본적으로 알고 있는 개념입니다.
이 구조에서는 HTTP 프로토콜로 데이터를 주고 받기 위해서는 Request를 보내고 Respone을 받아야 합니다.

HTTP Proctol Diagram

이제 요청을 어떻게 보내는지가 의문으로 남게 됩니다. 우리가 많이 이용하고 있는 URL를 사용하면 됩니다.
URL(Uniform Resource Locators)은 서버에 자원을 요청하기 위해 입력하는 영문 주소입니다.

Domain

URL을 이용하면 서버에 특정 데이터를 요청할 수 있습니다. 요청하는 데이터에 특정 동작을 수행하고 싶다면 HTTP Request Method를 사용하면 됩니다.

대표적으로 사용되는 메소드는 4개 입니다.

  • GET: 특정 리소스의 표시를 요청합니다. 사용하는 요청은 오직 데이터를 받기만 합니다.
  • POST: 특정 리소스에 엔티티를 제출할 때 스입니다. 종종 서버의 상태의 변화나 부작용을 일으킵니다.
  • PUT: 목적 리소스 모든 현재 표시를 요청 payload로 바꿉니다.
  • DELETE: 특정 리소스를 삭제합니다.

더 많은 요청 메서드를 알고 싶다면 HTTP 요청 메서드에서 HTTP 요청 메서드를 확인할 수 있습니다.

HTTP 1.1

HTTP1.1은 1999년 출시 이후로 지금까지 가장 많이 사용되고 있는 프로토콜입니다. HTTP1.1은 기본적으로 연결당 하나의 Request과 Response를 처리하기 때문에 동시전송 문제와 다수의 리소스를 처리하기에 속도 및 성능 이슈를 가지고 있습니다.

HOLB(Head Of Line Blocking) - 특정 응답 지연

HTTP/1.1은 Connection당 하나의 Request를 처리하기에 속도 문제가 있습니다. 이를 개선하기 위한 기법으로 pipelining이 제안 되었습니다. 이 방식의 경우에는 하나의 Connection을 통해 다수 개의 파일을 Request/Response 받을 수 있는 기법을 말하는데, 이 기법을 통해 성능 향상 할 수 있으나 문제점이 있습니다.

만약 첫번째 이미지에 대한 Response가 지연되게 되면, 두,세번째 이미지는 첫번째 이미지의 응답처리가 완료되기 전까지 대기하게 됩니다. 이와 같은 현상을 HTTP의 Head of Line Blocking(HOLB)이라 부르고 pipelining 기법의 문제점 중 하나입니다.

RTT(Round Trip Time) 증가

HTTP1.1은 하나의 connection에 하나의 Request를 처리합니다. 이로 인해서 하나의 connection마다 tcp 연결을 하며, 신뢰성 연결을 하는 tcp connection은 시작시 3-way handshake, 종류 시 4-way handshake가 반복적으로 발생, 이로 인한 오버헤드가 발생합니다.

heavy header

HTTP1.1의 header에는 많은 metadata가 저장되어 있습니다. 사용자가 방문한 웹 페이지는 다수의 HTTP Request가 발생하게 되는데 이 경우에는 매 Request마다 중복된 Header 값을 전송하며, 이 중 Cookie가 큰 문제입니다.

HTTP2.0

HTTP2.0은 HTTP1.1의 프로토콜을 계승해 동일한 API면서 성능 향상에 초점을 맞췄습니다.

Multiplexed Streams

한 Connection으로 동시에 여러개 메시지를 주고 받을 수 있으며, Response는 순서에 상관없이 stream으로 주고 받습니다.

Stream Prioritization

리소스 간 우선순위를 설정해 클라이언트가 먼저 필요한 리소스부터 보내줍니다.

Server Push

서버는 클라이언트의 요청에 대해 요청하지 않은 리소스를 마음대로 보내줄 수 있습니다.

Header Compression

Header table과 Huffman Encoding 기법(HPACK 압축방식)을 이용하여 압축 했습니다.

IDL(Interface Befinition Language)

서버와 클라이언트가 정보를 주고 받는 규칙이 프로토콜이라면, IDL은 정보를 저장하는 규칙입니다. 대표적인 IDL은 3가지가 있습니다.

XML

XML(eXtensible Markup Langauge)은 어떠한 데이터를 설명하기 위해 이름을 임의로 지은 태그로 데이터를 감사며, 태그로 사용자가 직접 데이터를 정의할 수 있습니다. XML의 경우에는 HTML처럼 데이터를 보여주는 것이 목적이 아니라 데이터를 저장하고 전단할 목적으로 만들어졌습니다.

JSON

JSON(JavaScript Object Notation)은 JavaScript의 사용도가 높아지면서 더불어서 많이 사용되고 있는 데이터 구조입니다.
XML이 가진 읽기 불편하고 복잡하고 느린 속도 문제를 해결했습니다. 특히 key-value로 정의된 구조 자체가 굉장히 사람에는 직관적으로 읽고 사용할 수 있습니다.

Protocol Buffers(Protoc & Proto)

XML의 문제점을 개선하기 위해 제안된 IDL입니다. XML보다 월등한 성능을 지닙니다.

Protocol Buffer는 구조화(structured)된 데이터를 직렬화(serialization)하기 위한 프로토콜로써 XML보다 작고 빠르고 간단합니다. XML 스키마처럼 .proto파일에 Protocol Buffer 메세지 타입을 정의합니다. Protocol Buffer는 구조화된 데이터를 직렬화하는데 있어서 XML보다 많은 장점들을 가지고 있습니다.

  • 간단함.
  • 파일 크기가 3에서 10배 정도 작음.
  • 속도가 20에서 100배 정도 빠름.
  • XML보다 가독성이 좋고 명시적임.
syntax = "proto3"

package search

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

최신 버전이 proto3가 있으며, 예전 버전인 proto2가 있습니다.
권장하는 버전은 최신 버전인 proto3를 사용하길 권장합니다.

결론: gRPC가 무엇인가?

gRPC는 구글에서 만든 RPC 플랫폼이며 Protocol Buffer와 RPC를 사용합니다.
최신 버전의 IDL로 Proto3를 사용할 수 있습니다. Java,C++, Python, Java Lite, Ruby, JavaScript, Go 등 다양한 언어에서 사용할 수 있습니다.
SSL/TLS를 사용하여서 서버를 인증하고 클라언트와 서버 간에 교환되는 모든 데이터를 암호화 합니다.
HTTP 2.0를 사용하여서 성능이 뛰어나고 확장 가능한 API를 지원합니다.

gRPC에서 클라이언트 응용 프로그램을 서버에서 함수를 바로 호출 할 수 있어 분산 MSA(Micro Service Architecture)를 쉽게 구현 할 수 있습니다.
서버 측에서는 서버 인터페이스를 구현하고 gRPC 서버를 실행하여 클라이언트 호출을 처리합니다. Diagram

참고한 내용들