Cloudforet 오픈소스 프로젝트 개발에 참여하며 Cloudforet 내부 서비스 간 통신에 gRPC 프로토콜을 사용한다는 것을 알게 되었다. gRPC를 장점, 단점을 중심으로 알아보자.
gRPC(google Remote Procedure Call)은 google에서 개발한 RPC 프레임워크이다. gRPC는 서비스간 통신이 빈번한 환경에서 성능과 효율성을 목적으로 사용한다. 특히 마이크로 서비스 아키텍처에서 서비스간 통신에 많이 사용한다. 서비스간 통신이 잦기 때문이다.
정의에서 알 수 있듯이 gRPC를 이해하기 위해서는 RPC(Remote Procedure Call)을 이해해야한다. 원격 프로시저 호출(RPC, Remote Procedure Call)은 쉽게말해 별도의 추가 코딩 없이 외부의 함수를 실행할 수 있게 하는 프로세스 간 통신 기술을 의미한다. 통신을 하기로 한 주체 간 통신 인터페이스를 정의하고, gRPC 클라이언트는 애플리케이션 내에서 함수를 직접 호출하는 것처럼 정의된 함수를 간접적으로 호출 가능하다.
“구매”라는 행위로 예를 들어보자.
service OrderService {
rpc purchase(PurchaseRequest) returns (PurchaseResponse);
}
위와 같은 인터페이스를 정의한다면, gRPC 통신 클라이언트는 purchase 함수를 자신 내부에 정의된 함수처럼 사용하여 다른 서버와 통신하는 것을 말한다.
gRPC는 HTTP/2 프로토콜을 사용한다. HTTP/1.1은 클라이언트 요청 시 서버가 응답하는 단방향 구조로 되어있으며, 매번 요청 시 연결을 맺아야하는 비효율을 가지고 있다. 이에 반대 HTTP/2는 연결 한번에 여러개의 메시지를 보낼 수 있으며, 클라이언트 요청 없이 서버가 클라이언트에게 데이터를 보내는 양방향 통신이 가능하다.
gRPC는 HTTP/2의 장점에서 볼 수 있는 것처럼 양방향 통신, 최소화된 클라이언트 요청으로 데이터를 주고 받는 효율성을 가진다.
HTTP가 json, xml을 사용하여 데이터를 직렬화 후 통신하는 것처럼, gRPC는 Protocol Buffer라는 직렬화 방식을 사용한다. Protocol Buffer는 바이너리 형식으로 데이터를 직렬화 하는 기법인데, 직렬화 후의 크기가 json, xml에 비해 매우 작다. 이 떄문에 더욱 빠른 데이터 전송이 가능하다.
고성능, 고효율 통신을 달성할 수 있는 gRPC의 몇가지 단점을 살펴보자.
첫번째로 기존 REST API와의 호환이 되지 않는다는 점이 있다. REST와 gRPC는 구현이 상이하기 때문에 상호 호환이 되지 않는다. 따라서 기존에 REST 방식으로 진행되는 프로젝트가 대다수인 현재 도입 사례가 많지 않으며 레퍼런스가 부족하다는 단점이 존재한다.
두번째로는 개발 초기 설정이 많이 필요하다는 점이다. 위에서 본 것과 같이 통신 주체간의 인터페이스와 주고받는 데이터의 형식인 스키마 정의가 필요하다. 따라서 초기 개발 세팅에 다른 프로토콜에 비해서 많이 비용이 투여된다.
세번째는 Protocol Buffer의 특징에서 연결되는데, 바이너리 형식의 데이터 디버깅 어려움이 존재한다는 것이다. 아래는 구매 정보에 대한 json 형식의 데이터와 protocol buffer 메시지를 나타낸 것이다.
{
"orderId": 1,
"customerId": 123,
"items": [987, 988],
"couponCode": "ALLFREE",
"paymentMode": "CASH",
"shippingAddress": {
"name": "Alice",
"address": "xyz street",
"pincode": "111111"
}
}
8,1,16,123,26,4,219,7,220,7,34,7,65,76,76,70,82,69,69,40,1,50,27,10,5,65,108,105,99,101,18,10,120,121,122,32,115,116,114,101,101,116,26,6,49,49,49,49,49,49
위와 같이 바이너리로 전환되어 네트워크를 통해 데이터가 전달되어 높은 성능이 보장되지만 가독성이 떨어지는 단점이 존재한다.
gRPC와 REST 비교 - 애플리케이션 설계의 차이 - AWS