본문 바로가기
프로그래밍

1. gRPC란 무엇인가?

by YuminK 2022. 4. 10.
gRPC는 구글이 최초로 개발한 오픈 소스 원격 프로시저 호출 시스템이다. 전송을 위해 HTTP/2를, 인터페이스 정의 언어로 프로토콜 버퍼를 사용하며 인증, 양방향 스트리밍 및 흐름 제어, 차단 및 비차단 바인딩, 취소 및 타임아웃 등의 기능을 제공한다. 위키백과

최초 출시일:  2016년 8월

 

Introduction to gRPC

An introduction to gRPC and protocol buffers.

grpc.io

gRPC는 포로토콜 버퍼를 사용하며 Interface Definition Language(IDL)을 메시지 교환 포맷으로 쓴다.

클라이언트에서는 직접적으로 서버 메소드를 호출할 수 있다. 분산 어플리케이션과 서비스를 만드는데 쉽다.

 

gRPC는 서비스의 정의를 기반으로 하는데, 서버에서는 인터페이스를 실행하며 클라이언트 요청을 처리한다.

클라이언트는 stub(일부 언어에서는 클라이언트라고 함)을 가지는데 서버 메소드와 같은 형태이다.

gRPC클라이언트와 서버는 다양한 환경에서 구동된다. gRPC가 지원하는 어떠한 언어로도 작성될 수 있으며 예를 들면, 자바로 gRPC서버를 작성하고 클라이언트에서 Go, Python, 또는 루비를 사용할 수 있다. 

 

기본적으로 gPRC는 데이터 구조 직렬화를 위해 protocol buffers를 사용하는데, json 포맷도 사용한다.

프로토 파일은 .proto 확장자를 가지는 일반적인 텍스트 파일이다. 프로토콜 버터는 메시지로서 구조화되며 각 메시지는 논리적인 레코드를 가진다.(Key-value를 포함하여 Fields라고 불리는)

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

일단, 구조를 만들면 프로토 파일을 가지고 proto buffer compiler(protoc)를 사용하여 데이터 접근 클래스들을 원하는 언어로 생성한다. 각 필드에 대한 간단한 접근자를 제공하는데 name(), set_name() 혹은 raw bytes 파일로부터 직렬화하고 파싱하기 위한 메소드를 제공한다. 

 

proto 파일에서 파라미터와 반환 타입을 가지고 gPRC서비스를 정의한다.

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

 

 

Overview  |  Protocol Buffers  |  Google Developers

Protocol buffers provide a language-neutral, platform-neutral, extensible mechanism for serializing structured data in a forward-compatible and backward-compatible way. It’s like JSON, except it's smaller and faster, and it generates native language bind

developers.google.com

 

프로토콜 버퍼는 언어 중립, 플랫폼 중립의 확장 가능 메카니즘을 제공하며 front, back 모두 양립할 수 있는 형태이다. 

json처럼(더 작고 빠르다는 점에서 다르다) 또한 native 코드로 연결이 된다.

 

프로토콜 버퍼는 .proto 파일에서 생성된 정의의 조합이다. (데이터, 런타임 동작을 위한 직렬화 포맷 데이터 처리)

 

프로토콜 버퍼는 유형화된 패킷들에 대한 직렬화 방식을 몇 mb의 크기로 제공한다. 임시 네트워크 트래픽과 장기간 데이터 저장소 모두 처리하기에 적합한 형태이다. 프로토콜 버퍼는 기존 데이터들을 무효화하거나 코드 업데이트를 요청할 필요가 없습니다.  

 

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;
}

 

다음은 proto 파일에서 생성된 메소드를 사용하는 방법을 알려줍니다.

Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
output = new FileOutputStream(args[0]);
john.writeTo(output);

 

 

 

프로토콜 버퍼는 언어 중립, 플랫폼 중립의 어떠한 상황에서도 이상적인 선택입니다. 통신 프로토콜을 정의하고 데이터 저장을 위해 가장 많이 사용이 됩니다.

 

1. 작은 데이터 저장소

2. 빠른 파싱

3. 다양한 언어에 대한 지원

4. 자동 생성 클래스로 인한 기능 최적화

 

프로토콜 버퍼를 사용하기에 적합하지 않을 때

1. 프로토콜 버퍼는 전체 메시지가 메모리에 한번에 로드될 수 있다고 추정하는 경향이 있습니다. 몇 메가를 초과하는 데이터라면 다른 방안을 생각해 보세요. 대용량으로 처리할 때 여러 복사본이 생성될 수 있으며 이는 놀라울 정도로 메모리를 사용할 수도 있습니다. 

 

2. 프로토콜 버퍼가 직렬화되었을 때, 같은 데이터에 다양한 직렬화 정보가 있을 수 있어, 완전히 데이터를 파싱하지 않고서는 비교할 수가 없습니다.

 

3. 메시지가 압축되지 않았을 때, 메시지는 zip 혹은 gzip 파일 등으로 압출이 될 수 있습니다. JPEG나 PNG에서 사용하는 특수 목적 압출 알고리즘은 적절하게 사용될 때 더 작은 파일을 생성합니다. 

 

4. 부동 소수점 번호의 대규모 다 차원 배열을 포함하는 과학 엔지니어링 분야에서 최대 효율을 보이지 않습니다.

 

5. 프로토콜 버퍼는 객체지향 언어가 아닌 경우 잘 지원되지 않습니다.

 

6. 프로토콜 버퍼는 본질적으로 자신의 데이터를 설명하지 않습니다. 하지만 완전히 반영되는 스키마 정보를 가지고 있습니다. 이는 동시적인 .proto 파일없이 완전히 해석할 수 없음을 의미합니다.

 

7. 프로토콜 버퍼는 어느 기관이 공식적인 표준이 아닙니다. 이는 법적이나 다른 요구 사항이 필요한 환경에서 사용하기에 적합하지 않음을 의미합니다. 

 

이 그림은 프로토콜 버퍼가 데이터와 함께 동작하는 것을 보여줍니다.

프로토콜 버퍼에 의해 생성된 코드는 데이터를 얻기위한 유틸리티 방법을 제공합니다. (데이터에서 개별 값을 추출하거나 데이터가 존재하는지 확인, 스트림이나 파일로 다시 직렬화 혹은 유용한 함수)

 

 

프로토콜 버퍼 정의 문법

1. Message 타입: 정의를 중첩할 수 있습니다. (데이터 집합의 반복을 위해)

2. enum 타입: 여러 개의 데이터 중에 하나를 구체화할 수 있습니다.

3. oneof 타입: 메시지가 수많은 추가적인 필드를 가지고 있는 경우 사용할 수 있으며, 최대 한 개의 필드가 동시에 설정됩니다. 

4. map 타입: key-value pair

 

댓글