본문 바로가기

Tech/gRPC

[gRPC] gRPC 와 Protocol Buffer

반응형

1. gRPC ?

gRPC 는 구글에서 만든 RPC (Remote Procedure Call) 'Google Remote Procedure Call' 의 줄임말이다. 프로토콜 버퍼를 IDL 로 사용하며 서로 다른 장치의 프로그램 간의 메서드 호출을 가능하게 해주어 쉽게 분산처리 시스템을 구축할 수 있도록 해준다.

 

gRPC 는 다른 RPC 들과 같이 서비스를 정의하는 것과 원격으로 호출할 수 있는 함수들과 함수의 매개변수, 반환타입 등을 지정하는 것을 기반으로 한다. 서버측에서는 해당 인터페이스를 구현하고 gRPC 서버를 실행하여 클라이언트의 요청을 처리한다. 클라이언트측은 서버와 같은 기능을 제공하는 stub, 스텁을 가지고 통신을 수행한다.

 

gRPC 통신 예제 (https://grpc.io/docs/what-is-grpc/introduction)

 

gRPC 클라이언트와 서버는 여러가지 환경에서 통신할 수 있으며 Java, Python, Go, Ruby 등과 같이 gRPC 가 지원하는 여러가지 언어로 작성할 수 있다.

 

※ RPC (Remote Procedure Call)

RPC 는 네트워크로 연결된 서버 상의 프로시저 (함수, 메서드 등) 을 원격으로 호출할 수 있는 기능이다. RPC 를 통해 원격지의 자원을 내 것처럼 사용할 수 있다.

클라이언트가 서버의 프로시저를 호출하면 요청을 통해 프로시저에 사용될 매개변수가 전달되고 서버에서는 해당 매개변수로 프로시저를 수행한 결과를 반환한다. 이때 매개변수와 수행 결과와 같이 주고받는 함수에 대한 명세가 정의되어 있어야 하는데, 서로 다른 언어간에 통신을 가능하게 하기위하여 IDL 로 이를 정의한다.

서버와 클라이언트는 서로 다른 주소 공간을 사용하기 때문에 함수 호출에 사용할 매개 변수의 변환이 필요하다. 이러한 변환을 담당하는 것이 Stub, 스텁이다. 스텁은 IDL 파일에 정의된 형식을 해당 언어에 맞게 생성한다. 이를 이용하여 클라이언트 스텁은 함수 호출에 사용된 파라미터의 변환, 마샬링 및 함수 실행 후 서버에서 전달 받은 결과의 변환을 수행한다. 서버 스텁은 클라이언트가 전달한 매개 변수의 역변환, 언마샬링 및 함수 실행 후 전달하는 결과의 변환을 수행한다.

 

※ IDL (Interface Definition Language)

IDL 은 Interface Definition Language 또는 Interface Description Language 의 줄임말로 특정 언어로 쓰인 프로그램이나 객체를 다른 언어로 쓰인 프로그램과 통신할 수 있도록 하기위해서 사용하는 중립적인 언어이다. 한 언어에 국한되지 않는 중립적인 방법으로 인터페이스를 표현하여 서로 다른 언어간에 통신을 가능하게 한다.

2. Protocol Buffer, 프로토콜 버퍼

gRPC 는 기본적으로 프로토콜 버퍼를 IDL 로 사용한다. 프로토콜 버퍼는 특정 언어에 종속되지 않은 언어 중립적이고 플랫폼 중립적인 데이터를 직렬화 (Serialization) 하는 기법이다.

 

프로토콜 버퍼는 사용하고자 하는 데이터 형식으로 프로토 파일에 작성하여 사용할 수 있다.  프로토 파일은 '.proto' 확장자를 가진 텍스트 파일로 프로토콜 버퍼의 통신을 위한 message 와 service 가 정의된다. 프로토 파입은 빌드시에 프로토 컴파일러 'protoc' 가 사용자가 정의한 프로그래밍 언어에 맞는 코드를 작성하는데 사용된다. 작성된 코드는 프로토콜 버퍼에 대응되는 데이터 클래스와 데이터의 값을 다룰 수 있는 name() 또는 set_name() 과 같은 accessor 메서드들로 구성된다.

- 프로토 파일 예제

프로토 파일 예제와 이를 자바로 컴파일하여 사용하는 예제를 확인해보려 한다.

 

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

 

위 코드는 프로토 파일에 정의된 Person 이라는 메시지이다. name, id, email 이라는 필드를 가지고 있다. 해당 프로토 파일을 자바로 컴파일하면 Person 인스턴스를 생성할 수 있는 Builder 클래스가 생성되고 아래의 예제와 같이 사용할 수 있다.

 

Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdo@example.com")
    .build();

output = new FileOutputStream(args[0]);
john.writeTo(output);

- 프로토콜 버퍼의 장단점

프로토콜 버퍼는 언어나 플랫폼에 종속되지 않고 구조화된 데이터를 직렬화할 수 있다. 이때문에 서로 다른 프로세스 간의 통신 프로토콜이다 데이터 저장소에 사용된다.

 

프로토콜 버퍼는 크기가 작고 직렬화/역직렬화가 빠르기 때문에 대용량 데이터를 처리할 때 유리하다. 또한 여러 프로그래밍 언어에서 사용가능하다는 장점이 있다.

 

반면에 프로토콜 버퍼는 전체 메시지가 한번에 메모리에 올라간다고 가정하기 때문에 메가바이트 이상의 큰 데이터 전송에 대해서는 다른 솔루션을 고려해보아야 한다.

[Reference]

- https://grpc.io/docs/what-is-grpc/introduction/

- https://blog.naver.com/n_cloudplatform/221751268831

- https://velog.io/@roycewon/RPC%EC%99%80-gRPC

- https://protobuf.dev/overview/

반응형

'Tech > gRPC' 카테고리의 다른 글

[gRPC] gRPC - Java  (0) 2024.05.23
[gRPC] Proto file (.proto) - Message, Service  (0) 2024.05.13